
次のファイルがあります。
1 UA
2 GB
3 UA
3 UA
2 US
1 UA
4 US
2番目の列にグループ化し、最初の列に合計を計算する方法は?したがって、出力は次のようになります。
8 UA
6 US
2 GB
答え1
そしてGNU awk
:
$ awk 'BEGIN{PROCINFO["sorted_in"] = "@val_num_desc"}
{a[$2]+=$1} END{for(k in a) print a[k], k}' ip.txt
8 UA
6 US
2 GB
バラよりgawk マニュアル: 事前定義された配列スキャン順序の使用ソートオプションの詳細をご覧ください。
そしてperl
:
perl -lane '$h{$F[1]}+=$F[0]; END{print "$h{$_} $_" for
sort {$h{$b} <=> $h{$a}} keys %h}' ip.txt
答え2
GNUの使用datamash
:
$ datamash -W -s -g 2 sum 1 <file
GB 2
UA 8
US 6
スペースをフィールド区切り文字として処理し、2番目のフィールドの入力を並べ替え、このフィールドでグループ化し、各グループの最初のフィールドを合計します。
awk '{ print $2, $1 }'
列を交換し(datamash
常に出力でグループ化された列を最初に作成します)、sort -nr
例のように出力を降順に並べ替えるには、出力をパイプします。
$ datamash -W -s -g 2 sum 1 <file | awk '{ print $2, $1 }' | sort -nr
8 UA
6 US
2 GB
要約するとawk
:
$ awk '{ sum[$2] += $1 } END { for (i in sum) print sum[i], i }' file
8 UA
2 GB
6 US
sort -nr
上記のように並べ替えるには渡してください。