web-dev-qa-db-ja.com

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

共通の値を持つ複数のテーブルをマージするUNIXのawkコマンドに関する質問があります

Tab1

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には、7番目の列の値に関連付けられたファイル1のGeneIDが含まれます{print $ 1、$ 7、h [$ 1]} hの値に含まれるGeneIDの2番目のファイルの最初/ 7列を出力します

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

Geneid Sample_1 Sample_2
ENSG00000278267 0 0 
ENSG00000243485 0 0 

私はこのウェブサイトを見て、人々はすべてのコードを投稿しましたが、私はコマンドを本当に理解していません、それで誰かがこれらのファイルをマージする方法を知っていて、コマンドのパラメーターを説明できますか?

1
Nicolas
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にパイプします

2
glenn jackman