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

αғs*_*нιη 4 command-line awk text-processing

如何使用awk.

我正在使用awk

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

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

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

A 2 25 
B 1 12 
C 3 18
Run Code Online (Sandbox Code Playgroud)

输入:

A,15
C,13
C,4
A,10
B,12
C,1
Run Code Online (Sandbox Code Playgroud)

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

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

ter*_*don 6

不,没有这样的索引。数组值不计算它们增加了多少次。这里最自然的做法是使用第二个数组:

$ 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
Run Code Online (Sandbox Code Playgroud)

您还可以使用 Kos 的回答中所示的二维数组,但是,正如您所看到的,这并没有以任何方式简化事情。或者,您可以使用一些 perl 魔法:

$ 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
Run Code Online (Sandbox Code Playgroud)

不,这不是线噪声,是的,它使用单个阵列来打印所有内容。