![awk 用于将多个文件与公共列合并](https://linux22.com/image/139792/awk%20%E7%94%A8%E4%BA%8E%E5%B0%86%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%8E%E5%85%AC%E5%85%B1%E5%88%97%E5%90%88%E5%B9%B6.png)
我有一个关于 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 包含与第 7 列中的值关联的文件 1 的 GeneID {print $1,$7,h[$1]} 打印第二个文件的第一/七/列,以查找 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
如果您想排列列,请将输出通过管道传输到