所以我有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
但他们只需要为一些文件执行此操作。
编辑:Nathan和joepd都工作并产生类似的输出 谢谢!
Nathan的解决方案将产生分隔的输出空间
joepd将产生具有标题的输出(原始制表符分隔),第一列用两个空格分隔,其余空格分隔。
答案 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
用于忽略每个文件中的标题行。