次のような行を含むテキストファイルがあるとします。
foo 10
bar 15
bar 5
foo 30
...
次の出力を生成する最も簡単な方法は何ですか。
foo 40
bar 20
?
これは行います:
awk '{arr[$1]+=$2;} END { for (i in arr) print i, arr[i]}' file
詳細については、Awkの連想配列を参照してください。
このawkスクリプトを使用します。
awk '{sums[$1] += $2} END {for (a in sums) print a, sums[a]}' infile
出力:
foo 40
bar 20
perlに興味がある場合:
perl -F -lane '$X{$F[0]}=$X{$F[0]}+$F[1];if(eof){foreach (keys %X){print $_." ".$X{$_}}}' your_file
これがsort、GNU sed、bcの1つの方法です。
sort infile |
sed -r ':a; N; s/([^ ]+) +([^\n]+)\n\1/\1 \2 +/; ta; P; D' |
sed -r 'h; s/[^ ]+/echo/; s/$/ | bc/e; G; s/([^\n]+)\n([^ ]+).*/\2 \1/'
出力:
bar 20
foo 40
最初のsedは、同じキーで隣接する行を結合し+
、数値の間にaを追加し、2番目のsedは合計をbcに渡します。