共通の値を持つ複数のテーブルをマージする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
私はこのウェブサイトを見て、人々はすべてのコードを投稿しましたが、私はコマンドを本当に理解していません、それで誰かがこれらのファイルをマージする方法を知っていて、コマンドのパラメーターを説明できますか?
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
にパイプします