ファイル1の遺伝子名をファイル2の遺伝子コメント情報に置き換えたいと思います。
ファイル1は次のようになります。最初の列にはOG識別子があり、2番目からXnd列には遺伝子名があります。
OG0000008,aly11306X1, aly15270X1, aly1603X45, aly1603X46
OG0000009,Tni22G01870, Tni22G01880, Tni22G01890, Tni22G01900, Tni22G01910, Tni22G01920
OG0000010,BANYX1.2.t00767, BANYX1.2.t00769, BANYX1.2.t00774, BANYX1.2.t00775, BANYX1.2.t00861
注:2列目のすべての遺伝子名
aly11306X1 Pfam PF16207 IPR032443
aly15270X1 Pfam PF13923
aly1603X45 Pfam PF01509 IPR002501 GO:0006396
aly1603X46 Pfam PF04845 IPR006628 GO:0000977|GO:0032422
Tni22G01870 Pfam PF02779 IPR005475
Tni22G01880 Pfam PF02780 IPR033248
Tni22G01890 Pfam PF00456 IPR005474
Tni22G01900 Pfam PF04949 IPR007033
Tni22G01910 Pfam PF00250 IPR001766 GO:0003700|GO:0006355|GO:0043565
Tni22G01920 Pfam PF00379 IPR000618 GO:0042302
BANYX1.2.t00767 Pfam PF00400 IPR001680 GO:0005515
BANYX1.2.t00769 Pfam PF00400 IPR001680 GO:0005515
BANYX1.2.t00774 Pfam PF00400 IPR001680 GO:0005515
BANYX1.2.t00775 Pfam PF00400 IPR001680 GO:0005515
BANYX1.2.t00861 Pfam PF04949 IPR007033
BANYX1.2.t00861 Pfam PF08704 IPR014816 GO:0016429|GO:0030488|GO:0031515
出力ファイルで、ファイル1の列1のOG識別子を検索し、ファイル2の列3の遺伝子コメントを検索しようとしています。つまり、ファイル1の遺伝子名をファイル2の遺伝子PF番号に置き換える必要があります。ここでは区切り記号についてあまり気にしません。
出力:
OG0000008 PF16207 PF13923 PF01509 PF04845
OG0000009 PF02779 PF02780 PF00456 PF04949 PF00250 PF00379
OG0000010 PF00400 PF04949 PF08704
この問題を解決しようとしましたが、ファイルの長さは実際には1000レコードなので動作しません。 AWKに切り替えることにしましたが、残念ながら私のawkの知識は限られていますが、本当に良くなりたいです。ここで私を助けることができますか?
簡単に始めて、2番目の列内でのみ検索しようとしましたが、ファイル全体が印刷されます。
awk -F "," 'NR==FNR{a[$2];next} $2 in a {print $1, $3}' File1 File2
誰でも私を助けることができますか?
答え1
配列の配列にGNU awkを使用する:
$ cat tst.awk
NR==FNR {
genes_annots[$1][$3]
next
}
{
delete annots
for ( i=2; i<=NF; i++ ) {
gene = $i
if ( gene in genes_annots ) {
for ( annot in genes_annots[gene] ) {
annots[annot]
}
}
}
printf "%s", $1
for (annot in annots) {
printf "%s%s", OFS, annot
}
print ""
}
$ awk -f tst.awk file2 FS='[, ]+' file1
OG0000008 PF01509 PF16207 PF13923 PF04845
OG0000009 PF00250 PF02779 PF00379 PF04949 PF00456 PF02780
OG0000010 PF08704 PF04949 PF00400
上記の方法は、同じ注釈を持つ2つの独立した遺伝子がある場合にも機能します。例えば、遺伝子Tni22G01900およびBANYX1.2.t00861の両方に注釈PF04949がある。
$ cat file3
OG0000099,Tni22G01900, BANYX1.2.t00861
$ awk -f tst.awk file2 FS='[, ]+' file3
OG0000099 PF08704 PF04949
上記では、コメントがその行内にすべて存在し、一意の出力の各行に表示されるコメントの順序は重要ではないと仮定しました。