AWK: 別の列の項目に基づく列の値の合計 [重複]

AWK: 別の列の項目に基づく列の値の合計 [重複]

同じ表の最初の列に与えられた項目に基づいて、下の表の3番目の列にリストされている値を合計したいと思います。表の内容は次のとおりです。

John|Login|2
Mary|Login|10
Mary|Payroll|100
John|Login|200
John|Logout|10
Mary|Payroll|10

予想される結果は次のとおりです。

John|Login|202
John|Logout|10
Mary|Login|10
Mary|Payroll|110

この出力をどのようにawk取得できますか?

答え1

このコマンドは私にとって効果的です。それはあなたに役立ちます:

     awk -F '|' '{a[$1"|"$2"|"]+= $3} END{for (i in a) print i, a[i]}' filename | sort -k 1,1
John|Login| 202
John|Logout| 10
Mary|Login| 10
Mary|Payroll| 110

答え2

GNUがインストールされている場合は、順序を正しく設定するためにawk他のツールを使用する必要はありませんが、sort直接設定できますawk。特殊変数を設定することで、配列巡回の仕組みを設定できますPROCINFO["sorted_in"]。バラより事前定義された配列スキャン順序の使用gawk

あなたの場合は、インデックスを昇順に並べ替えるように設定できます

awk -vFS="|" -vOFS="|"  '{ 
                             primaryKey=($1 FS $2)
                         }{ 
                             db[primaryKey]+=$3; next 
                         } END { 
                             PROCINFO["sorted_in"] = "@ind_str_asc"
                             for(key in db) 
                                 print key, db[key] 
                         }' file

関連情報