结果

结果

我有一个这样的文件:

paper 3
paper 6
eraser 2
pencil 9
pencil 44
pencil 1

我想总结一下具有共同第一个字段的行,如下所示:

paper 9
eraser 2
pencil 54

有没有一个可爱的衬线可以使用标准 Unix 实用程序来完成此操作?甚至是不那么标准的 Unix 实用程序。

答案1

看看这个:

$ echo "$a"
paper 3
paper 6
eraser 2
pencil 9
pencil 44
pencil 1

$ awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a[i]}' <(echo "$a")
pencil 54
eraser 2
paper 9

替换<(echo "$a)为您的file

$ awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a[i]}' file

答案2

使用不太标准的实用程序GNU 数据混合

$ datamash --whitespace groupby 1 sum 2 < file
paper   9
eraser  2
pencil  54

或者更简洁地说

$ datamash -Wg 1 sum 2 < file
paper   9
eraser  2
pencil  54

答案3

如果我们关心打印的顺序,那么我们可以这样做:

perl -lane '$h{$F[0]}+=$F[1]; $h[-1+keys%h]=$F[0]; END{print "$_ $h{$_}" for @h}'

这个想法是维护哈希中特定项目的运行总和%h以及特定项目在数组中出现的顺序@h。在文件末尾,我们只打印散列(键+值),但从@h数组中获取顺序。

结果

paper 9
eraser 2
pencil 54

答案4

这是 awk 中的一个不太可爱的衬里:

awk '{ if (prev && prev != $1) { print prev, sum; sum = 0 }; sum += $2; prev = $1 } END { print prev, sum }' < file.txt

它要求将第一个字段中具有相同值的行分组在一起。如果不是这种情况,您可以sort file.txt | awk ...

相关内容