結果

結果

次のファイルがあります。

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

関連情報