2番目の列で国別にグループ化し、結果の合計に基づいて並べ替えるにはどうすればよいですか?

2番目の列で国別にグループ化し、結果の合計に基づいて並べ替えるにはどうすればよいですか?

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

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上記のように並べ替えるには渡してください。

関連情報