对文件中的所有字符串进行排序并对每个字符串的数量求和

时间:2018-03-29 12:50:39

标签: bash

我有多个看起来像这样的文件:(格式:<string>,<number>)。

例如:

a,5
b,2
c,3

我想对所有这些进行排序和求和,以便最终输出为

<string>,<sum of all numbers>

例如两个文件:

第一个文件:

a,5
b,2
c,3

第二档:

a,1
b,2

输出:

a,6
b,4
c,3

首先我会使用cat *而不是sort。但接下来应该用什么?

2 个答案:

答案 0 :(得分:1)

使用awk:

$ awk 'BEGIN{FS=OFS=","}{a[$1]+=$2}END{for(i in a)print i,a[i]}' file1 file2
a,6
b,4
c,3

输出顺序是awk随机的。例如,sort可以根据需要对其进行排序。

编辑:到commant:

$ awk 'BEGIN{FS=OFS=","}{if(($1 in a)==0||a[$1]<$2)a[$1]=$2}END{for(i in a)print i,a[i]}' file1 file2
a,5
b,2
c,3

答案 1 :(得分:1)

Awk是一个功能强大的命令,请查看一些教程here。您需要的一些具体示例,以及您理解awk

的概念

假设您的文件名为file.txt

a,5 b,2 c,3

您可以使用以下内容:

 awk -F, '{print $2}' file.txt

通过这个,您将获得第二列&#34;由符号&#39;,&#39;分隔。来自档案:file.txt

要对列进行求和,您可以使用以下内容:

awk -F, '{ total += $2; } END {print total}' file.txt

也就是说,使用临时变量来累积第二列中的每个值。

最后,您可以使用以下内容:

awk 'BEGIN{FS=OFS=","}{a[$1]+=$2}END{for(i in a)print i,a[i]}' file1 file2 ... fileN

您使用名为built-in awk的{​​{1}}变量来声明分隔符,该变量代表OFS,然后您可以执行循环添加第二列。< / p>

Output Field Separator VariableNote不需要sort,因为总和由key完成。并且还要考虑... fileN表示您将发送到脚本的N个文件。