使用 `awk` 打印唯一单词、出现次数和总数

使用 `awk` 打印唯一单词、出现次数和总数

如何使用单个数组在相关列中打印唯一的单词、它们出现的次数以及它们的值的总和awk

我正在使用awk类似:

awk -F, '{sum[$1]+=$2} END{for (x in sum) print x, sum[x]}' inFile

我可以修改上面的命令来打印唯一单词出现的总次数吗?以下示例输入的结果类似于以下结果:

结果(打印结果的顺序无关紧要):

A 2 25 
B 1 12 
C 3 18

输入:

A,15
C,13
C,4
A,10
B,12
C,1

我可以添加另一个数组来分别对它们进行计数,但我认为应该有另一种方法仅使用同一个数组来打印它。

数组中是否有任何索引sum可以存储所看到的总单词数?

答案1

不,没有这样的索引。数组值不会记录它们被增加的次数。这里最自然的做法是使用第二个数组:

$ awk -F, '{sum[$1]+=$2;seen[$1]++} END{for(x in sum) print x,seen[x],sum[x]}' file
A 2 25
B 1 12
C 3 18

您还可以使用二维数组,如 Kos 的答案中所示,但正如您所见,这实际上并没有以任何方式简化事情。或者,您可以使用一些 perl magic:

$ perl -F, -lane 'push @{$k{$F[0]}},${$k{$F[0]}}[-1]+$F[1]; 
            END{print "$_ ",$#{$k{$_}}+1," ${$k{$_}}[-1]" for keys(%k)}' file
C 3 18
B 1 12
A 2 25

不,这不是线路噪音,是的,它使用单个数组来打印所有内容。

答案2

这应该可以做到:

awk -F, '{x[$1]["count"]++;x[$1]["sum"]+=$2}END{for(y in x){print y,x[y]["count"],x[y]["sum"]}}' in

基本上,您用多维数组替换该数组,以便存储每个唯一第一个字段出现的次数以及它们相对的第二个字段的总和。

% cat in
A,15
C,13
C,4
A,10
B,12
C,1
% awk -F, '{x[$1]["count"]++;x[$1]["sum"]+=$2}END{for(y in x){print y,x[y]["count"],x[y]["sum"]}}' in
A 2 25
B 1 12
C 3 18

相关内容