一致するフィールドに基づいて列の合計

一致するフィールドに基づいて列の合計

次の形式の大容量ファイルがあります。

2 1019 0 12 
2 1019 3 0 
2 1021 0 2 
2 1021 2 0 
2 1022 4 5
2 1030 0 1 
2 1030 5 0 
2 1031 4 4

値が次の場合2列一致し、次の値を合計したいと思います。3列そして42行の値、それ以外の場合は一意の行の値の合計です。

だから私が望む出力は次のようになります。

2 1019 15 
2 1021 4 
2 1022 9 
2 1030 6 
2 1031 8

次の基準に従ってファイルを並べ替えることができます。2列awkORを使用しsortて最後の列の合計を取得しますawk。ただし、2行ではなく単一行にのみ適用されます。2列マッチ。

ベストアンサー1

私はPerlでこれをします:

$ perl -lane '$k{"$F[0] $F[1]"}+=$F[2]+$F[3]; 
              END{print "$_ $k{$_}" for keys(%k) }' file 
2 1019 15
2 1021 4
2 1030 6
2 1031 8
2 1022 9

またはちょっと:

awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file 

2番目の列に基づいて出力を並べ替えるには、次のようにパイプできますsort

awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file | sort -k2

どちらのソリューションも最初の列を含みます。アイデアは、最初と2番目の列をハッシュ(perl)または関連配列(awk)のキーとして使用することです。各ソリューションの鍵は、2column1 column2行目の2列目が同じですが、1列目が異なる場合は別々にグループ化されることです。

$ cat file
2 1019 2 3
2 1019 4 1
3 1019 2 2

$ awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file
3 1019 4
2 1019 10

おすすめ記事