4つのフィールド(ファイル1のフィールド1、2、4、5とファイル2のフィールド1、2、4、5)を使用して、2つのファイルFile1とFile2(スペースで区切り)を比較する必要があります。
論理:
ファイル 1 の列 1、2、4 がファイル 2 の列 1、2、4 と一致し、列 5 が一致しない場合、ファイル 1 とファイル 2 の 2 行が連結され、出力にリダイレクトされます。したがって、出力ファイルには、File1とFile2の列1、2、4は一致しますが、列5は一致しない行のみが含まれます。
ファイル1:
sc2/80 20 . A T 86 PASS N=2 F=5;U=4
sc2/60 55 . G T 76 PASS N=2 F=5;U=4
sc2/68 20 . T C 71 PASS N=2 F=5;U=4
sc2/24 24 . T G 31 PASS N=2 F=5;U=4
ファイル2:
sc2/80 20 . A C 80 PASS N=2 F=5;U=4
sc2/60 55 . G C 72 PASS N=2 F=5;U=4
sc2/68 20 . T C 71 PASS N=2 F=5;U=4
sc2/10 24 . T G 31 PASS N=2 F=5;U=4
sc2/40 59 . T G 31 PASS N=2 F=5;U=4
sc2/24 24 . A G 38 PASS N=2 F=5;U=4
出力:
sc2/80 20 . A T 86 PASS N=2 F=5;U=4
sc2/80 20 . A C 80 PASS N=2 F=5;U=4
sc2/60 55 . G T 76 PASS N=2 F=5;U=4
sc2/60 55 . G C 72 PASS N=2 F=5;U=4
私はこの分野に初めてアクセスし、助けてくれてありがとう。
ベストアンサー1
あなたはそれを使用することができますawk
。スクリプトに次のように入力しますscript.awk
。
FNR == NR {
f1[$1,$2,$4] = $0
f1_c14[$1,$2,$4] = 1
f1_c5[$1,$2,$4] = $5
next
}
f1_c14[$1,$2,$4] {
if ($5 != f1_c5[$1,$2,$4]) print f1[$1,$2,$4];
}
f1[$1,$2,$4] {
if ($5 != f1_c5[$1,$2,$4]) print $0;
}
それでは、次のように実行してください。
$ awk -f script.awk file1 file2
sc2/80 20 . A T 86 PASS N=2 F=5;U=4
sc2/80 20 . A C 80 PASS N=2 F=5;U=4
sc2/60 55 . G T 76 PASS N=2 F=5;U=4
sc2/60 55 . G C 72 PASS N=2 F=5;U=4
スクリプトは次のように動作します。このブロックは、および 3 つの配列をf1
生成f1_c14
しますf1_c5
。f1
file1の列1、2、4の内容を使用して索引付けされた配列内のfile1のすべての行を含みます。f1_c14
は、同じインデックス(1、2、4の内容)と値を持つ別の配列です1
。 3番目の配列は最初の2つと同じインデックスを使用し、その値はfile1の列5の値です。
FNR == NR {
f1[$1,$2,$4] = $0
f1_c14[$1,$2,$4] = 1
f1_c5[$1,$2,$4] = $5
next
}
次のブロックは、file1
列1、2、4がの列と一致する場合、最初のファイルの行を印刷する役割を果たしますfile2
。そしてANDの5番目の列が一致しない場合、その行のみがfile1
印刷されます。file1
file2
f1_c14[$1,$2,$4] {
if ($5 != f1_c5[$1,$2,$4]) print f1[$1,$2,$4];
}
3番目のブロックは、列1、2、4に対応する配列の関連行を印刷する役割を果たします。繰り返しますが、列5が一致しない場合にのみ印刷されますfile2
。f1
file2
f1[$1,$2,$4] {
if ($5 != f1_c5[$1,$2,$4]) print $0;
}
はい
上記のスクリプトを次のように実行します。
$ awk -f script.awk file1 file2
sc2/80 20 . A T 86 PASS N=2 F=5;U=4
sc2/80 20 . A C 80 PASS N=2 F=5;U=4
sc2/60 55 . G T 76 PASS N=2 F=5;U=4
sc2/60 55 . G C 72 PASS N=2 F=5;U=4
column
以下を使用して出力を少し整理できます。
$ awk -f script.awk file1 file2 | column -t
sc2/80 20 . A T 86 PASS N=2 F=5;U=4
sc2/80 20 . A C 80 PASS N=2 F=5;U=4
sc2/60 55 . G T 76 PASS N=2 F=5;U=4
sc2/60 55 . G C 72 PASS N=2 F=5;U=4
どのように動作しますか?
FNR == NRawk
これは特定の方法でファイルを繰り返す機能を利用します。ここではファイルを繰り返し、最初のファイルの1行にあるときにfile
その行の特定のコードブロックを実行しようとしていますfile1
。
この例は、FNR == NR
2つのシミュレーションファイルを提供するときに実行されるアクションを示しています。そのうちの1つには4つの行があり、もう1つには5つの行があります。
$ awk 'BEGIN {print "NR\tFNR\tline"} {print NR"\t"FNR"\t"$0}' \
<(seq 1 4) <(seq 1 5)
NR FNR line
1 1 1
2 2 2
3 3 3
4 4 4
5 1 1
6 2 2
7 3 3
8 4 4
9 5 5
その他のブロック
他のブロックf1_c14[$1,$2,$4]
ANDは、f1[$1,$2,$4]
その配列要素の値に値がある場合にのみ実行されます。