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 包含与第 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如果您想排列列,请将输出通过管道传输到

相关内容