複数のファイルを共通列にマージする awk

複数のファイルを共通列にマージする awk

複数のテーブルを共通値にマージするためのUnixのawkコマンドに関する質問があります。

1番テーブル

Geneid  Chr Start   End Strand  Length Sample_1
ENSG00000278267 1   17369   17436   -   68  0
ENSG00000243485 1;1;1   29554;30267;30976   30039;30667;31109   +;+;+   1021    0

タブ2

Geneid  Chr Start   End Strand  Length Sample_2
ENSG00000278267 1   17369   17436   -   68  0
ENSG00000243485 1;1;1   29554;30267;30976   30039;30667;31109   +;+;+   1021    0

タブ3

Geneid  Chr Start   End Strand  Length Sample_3
ENSG00000278267 1   17369   17436   -   68  0
ENSG00000243485 1;1;1   29554;30267;30976   30039;30667;31109   +;+;+   1021    0

ご覧のとおり、Geneidはこのテーブルに似ています。 GeneID列と「Sample_n」列のあるファイルを1にマージしたいと思います。

awk 'NR==FNR {h[$1] = $7; next} {print $1,$7,h[$1]}' Sample_1.txt Sample_2.txt | head

何も見逃していない場合は、次のことを意味します。 NR==FNR、最初のファイルは {h[$1] = $7; next}h を出力するテンプレートです。 h は、列 7 の値に関連付けられたファイル 1 の GeneID を含みます。 $1,$7,h[$1]} 2番目のファイルの最初/7番目/列を印刷して、h値に含まれるGeneIDを見つけます。

2つのファイルには機能しますが、3つ以上のファイルには機能しません。

Geneid Sample_1 Sample_2
ENSG00000278267 0 0 
ENSG00000243485 0 0 

このサイトを見て、人々はすべてのコードを投稿しましたが、コマンドをよく理解していませんが、これらのファイルをマージする方法を知り、コマンドのパラメータを説明できる人はいますか?

ベストアンサー1

awk '
    {samples[$1] = samples[$1] OFS $NF} 
    END {
        # print the header first
        print "Geneid", samples["Geneid"] 
        delete samples["Geneid"]
        # and then the rest of the data
        for (geneid in samples) print geneid, samples[geneid]
    }
' Tab*

| column -t列をソートするには、出力を次にパイプします。

おすすめ記事