4

次のような行を含むテキストファイルがあるとします。

foo 10
bar 15
bar 5
foo 30
...

次の出力を生成する最も簡単な方法は何ですか。

foo 40
bar 20

4

4 に答える 4

9

これは行います:

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

詳細については、Awkの連想配列を参照してください。

于 2012-11-06T20:37:43.730 に答える
5

このawkスクリプトを使用します。

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

出力:

foo 40
bar 20

連想配列の使用に関するこのawkチュートリアルを使用してください

于 2012-11-06T20:38:45.613 に答える
0

perlに興味がある場合:

perl -F -lane '$X{$F[0]}=$X{$F[0]}+$F[1];if(eof){foreach (keys %X){print $_." ".$X{$_}}}' your_file
于 2012-11-07T05:53:47.460 に答える
0

これが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に渡します。

于 2012-11-07T10:58:01.227 に答える