Linux 合并和汇总来自多个文件的数据

Linux 合并和汇总来自多个文件的数据,linux,shell,Linux,Shell,我有两个文件如下所示: 文件1 文件2 aaa 54 bbb 8 ccc 16 ddd 4 eee 66 fff 9 我想知道具体列的总数 (例如,两个文件中aaa的总和) 和ccc之和+ddd之和 和bbb之和+eee之和+fff之和) 例如,有没有一种简单的方法可以使用awk来实现这一点?如果您只需要求和,可以在纯bash中实现(这里使用关联数组,因此需要bash 4): declare-A和 而读取名称val1 val2;做 总和[$name]=$((val1+val2)) 完成

我有两个文件如下所示:

文件1

文件2

aaa 54
bbb 8
ccc 16
ddd 4
eee 66
fff 9
我想知道具体列的总数 (例如,两个文件中aaa的总和) 和ccc之和+ddd之和 和bbb之和+eee之和+fff之和)


例如,有没有一种简单的方法可以使用awk来实现这一点?

如果您只需要求和,可以在纯bash中实现(这里使用关联数组,因此需要bash 4):

declare-A和
而读取名称val1 val2;做
总和[$name]=$((val1+val2))

完成
kent$  awk 'NR==FNR{a[$1]=$2;next;}{a[$1]+=$2}END{print "sum of aaa:",a["aaa"]}' file1 file2
sum of aaa: 59
您可以更改
END{xxx}
部分以获得不同类型的“sum”:
e、 g.
a[“bbb”]+a[“eee”]
将为您提供bbb+eee之和

连接到一个文件中并使用:

awk '{a[$1]+= $2;}END{for(i in a){print i,a[i];}}' file
您可以通过管道将输出从cat传输到awk:

cat file1 file2 | awk '...

如果要对输出进行排序,请通过管道对其进行排序。

我也在做同样的事情,但由于我有大量文件,我不认为使用awk数组进行串联和求和是一个好主意

我实际上在用这个:

join -t$'\t' --check-order -a 1 -a 2 -e 0 -1 1 -2 1 file1 file2 > joined.tmp
awk 'BEGIN{FS="\t"; OFS="\t"}{print $1, $2+$3}' joined.tmp > merged.txt

我一直在寻找一种更快的方法,但我认为,对于大文件,此解决方案比前面答案中提出的解决方案要好。

请说明给定输入的所需输出。是的,awk是一种方法。这是一个很简单的练习,所以看看周围的一些例子。将所需的输出作为编辑添加到问题中可能比作为注释要好。thx Kent!工作正常,很抱歉Charles我没有看到我的评论被删掉,是的,最好是把它放在问题中,我的错,我是新来的这里没有必要使用
NR==FNR
命令。只需删除该模式/动作对<如果数组项不存在,则code>+=
相当于
=
。实际上这也很好,查尔斯,谢谢!我没有试过,因为我先看到了肯特的回答。。
cat file1 file2 | awk '...
join -t$'\t' --check-order -a 1 -a 2 -e 0 -1 1 -2 1 file1 file2 > joined.tmp
awk 'BEGIN{FS="\t"; OFS="\t"}{print $1, $2+$3}' joined.tmp > merged.txt