同じ表の最初の列に与えられた項目に基づいて、下の表の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