複数のテーブルを共通値にマージするための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
列をソートするには、出力を次にパイプします。