![1つの列から一意の値を取得し、次の2つの列を合計します。 [閉じる]](https://linux33.com/image/86583/1%E3%81%A4%E3%81%AE%E5%88%97%E3%81%8B%E3%82%89%E4%B8%80%E6%84%8F%E3%81%AE%E5%80%A4%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81%E6%AC%A1%E3%81%AE2%E3%81%A4%E3%81%AE%E5%88%97%E3%82%92%E5%90%88%E8%A8%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
次のテキストファイルがあります。
A 500 100 ABC
B 200 100 BBB
B 200 100 ACC
D 150 235 CDD
A 500 100 RER
C 210 653 DDD
C 210 653 DWR
D 150 653 DDW
D 150 653 DER
私が達成しようとしているのは、最初の識別名をフィルタリングし、その後のすべての値の合計(列2と列3の合計)を取得することです。たとえば、次のようになります。
A 1000 200
B 400 200
次のawk行を使用して最初の2つを操作しました。
awk '{a[$1]+=$2} END {for(i in a) print i,a[i] }' file
結果:
A 1000
B 400
私はミックスに3番目の列を追加する必要があると主張します。列3を追加する方法についてのヒントがある人はいますか?
答え1
次のテストバージョンをお試しください。
awk '{ colone[$1]+=$2; coltwo[$1]+=$3; } END { for (i in colone) { print i " " colone[i] " " coltwo[i]; }}' file
連想配列を使用します。有名なチュートリアルをご覧ください。Awk - チュートリアルと紹介 - Bruce Barnett
テストは次のとおりです。
awk '{ colone[$1]+=$2; coltwo[$1]+=$3; } END { for (i in colone) { print i " " colone[i] " " coltwo[i]; }}' file
A 1000 200
B 400 200
C 420 1306
D 450 1541