将许多文件与特定列中的匹配字段组合到单个文件

时间:2015-07-15 02:59:13

标签: unix awk merge text-processing text-manipulation

所以我有128个文件,有两列。 我希望通过第一列中的值匹配它们,并将每个文件的第二列中的值添加到单个文件中。

我能够在这里找到解决方案:

来自:https://unix.stackexchange.com/questions/159961/merging-2-files-with-based-on-field-match

awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1

它做了我想要的,但是我需要通过该文件夹中的每个文件。

有没有让这个命令循环遍历文件夹中的所有文件或者是否有更好的方法?

实施例: 输入

File 1:
    gene_id normalized_count
    A1BG|1  42.3332
    A1CF|29974  165.6696
    A2BP1|54715 0.0000
    A2LD1|87769 138.1270
    A2ML1|144568    2.7612
    A2M|2   7310.6121
    A4GALT|53947    348.3663
    A4GNT|51146 0.0000


File 2:
    gene_id normalized_count
    A1BG|1  18.2019
    A1CF|29974  129.6194
    A2BP1|54715 2.2063
    A2LD1|87769 65.3116
    A2ML1|144568    0.0000
    A2M|2   3415.8632
    A4GALT|53947    83.2874
    A4GNT|51146 0.0000


File 3:
    gene_id normalized_count
    A1BG|1  8.6285
    A1CF|29974  97.6385
    A2BP1|54715 0.0000
    A2LD1|87769 200.5540
    A2ML1|144568    0.0000
    A2M|2   984.0736
    A4GALT|53947    24.0690
    A4GNT|51146 0.4541

期望的输出

        gene_id normalized_count        
        A1BG|1  42.3332 18.2019 8.6285
        A1CF|29974  165.6696    129.6194    97.6385
        A2BP1|54715 0   2.2063  0
        A2LD1|87769 138.127 65.3116 200.554
        A2ML1|144568    2.7612  0   0
        A2M|2   7310.6121   3415.8632   984.0736
        A4GALT|53947    348.3663    83.2874 24.069
        A4GNT|51146 0   0   0.4541

对于所需的输出,我不关心列标签最终的结果。

我的问题是,我必须同时为数百个文件执行此操作才能生成一个文件。

以下是解决方案的其他类似问题 https://unix.stackexchange.com/questions/122919/merge-2-files-based-on-all-values-of-the-first-column-of-the-first-file

https://unix.stackexchange.com/questions/113879/how-to-merge-two-files-with-different-number-of-rows-in-shell

但他们只需要为一些文件执行此操作。

编辑:Nathan和joepd都工作并产生类似的输出 谢谢!

Nathan的解决方案将产生分隔的输出空间

joepd将产生具有标题的输出(原始制表符分隔),第一列用两个空格分隔,其余空格分隔。

2 个答案:

答案 0 :(得分:0)

您需要gawk

gawk '{a[$1]+=$2}; END{ for (i in a) print i, a[i]}' files*

如果这对您不起作用,请指定输入和输出。

修改

在您的规范之后,很明显您想要连接字符串。这个怎么样?

awk '
    NR==1  {title=$0}
    FNR!=1 {a[$1] = a[$1]" "$2}
    END {
        print title
        for (i in a)
            print i, a[i]
    }
' files* 

答案 1 :(得分:0)

这应该会为输入中的每个文件输出一列产生所需的输出:

awk 'FNR>2{a[$1]=a[$1] " " $2}; END{ for (i in a) print i a[i]}' File*

它的结构类似于@ joepd的答案,它在数字上对输入进行求和,而不是将它们连接起来。

FNR>2用于忽略每个文件中的标题行。