AWKを使用して検索して置き換えますが、複数の列と区切り文字を持つファイルでは、

AWKを使用して検索して置き換えますが、複数の列と区切り文字を持つファイルでは、

ファイル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

上記では、コメントがその行内にすべて存在し、一意の出力の各行に表示されるコメントの順序は重要ではないと仮定しました。

関連情報