2つのコメントファイルで3つの列を一致させ、その行を新しい出力ファイルに印刷します。

2つのコメントファイルで3つの列を一致させ、その行を新しい出力ファイルに印刷します。

2つのファイルがありますが、ファイル1とファイル2の列番号は同じです。最初の列には染色体番号があり、2番目の列にはプロモーター開始部位があり、3番目の列にはプロモーター停止部位があります。

ファイル1の3つの列すべてについて、ファイル2で一致するものが見つかった場合は、両方のファイルを一致させたいと思います。正確に3つと4つの列を表示する出力ファイルを生成したいと思います。 4番目には、スコアが1の一致とスコアが0の不一致が表示されます。

ファイル1:

chr1 899 1098
chr3 677 900
chr3 844 1045

ファイル2:

chr3 844 1045
chr1 899 1098
chr4 500 789

結果ファイル:

chr1 899 1098  1
chr3 677 900   0
chr3 844 1045  1
chr4 500 789   0

ファイルと一致する回答が見つかり、同じフォーラムで新しいファイルを出力しました。

awk 'FNR==NR{a[$1,$2,$3]=$0;next}{if(b=a[$1,$2,$3]){print b}}' file1 file2

しかし、出力ファイルに一致と不一致のスコア列も含めたいと思います。

答え1

スクリプト

#!/bin/bash
filea=$1
fileb=$2
fout=$3
sed -i "/^$/d" $filea $fileb
cat $filea | while read a b c
  do
    grep "$a.*$b.*$c" $fileb &>/dev/null && l="$a   $b  $c  1" || l="$a $b  $c  0"
    grep "$l" $fout &>/dev/null || echo "$l" >> $fout
  done
cat $fileb | while read a b c
  do
    grep "$a.*$b.*$c" $filea $fout &>/dev/null && l="$a $b  $c  1" || l="$a $b  $c  0"
    grep "$l" $fout &>/dev/null || echo "$l" >> $fout
  done

標準出力

younes@cbfcdf:~$ cat filea
chr1 899 1098
chr3 677 900
chr3 844 1045
younes@cbfcdf:~$ cat fileb
chr3 844 1045
chr1 899 1098
chr4 500 789
younes@cbfcdf:~$ ./script filea fileb new_file
younes@cbfcdf:~$ cat new_file 
chr1    899     1098    1
chr3    677     900     0
chr3    844     1045    1
chr4    500     789     0
younes@cbfcdf:~$

関連情報