1つの列から一意の値を取得し、次の2つの列を合計します。 [閉じる]

1つの列から一意の値を取得し、次の2つの列を合計します。 [閉じる]

次のテキストファイルがあります。

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

おすすめ記事