結果

結果

我有一個這樣的文件:

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 ...

相關內容