次の形式の大容量ファイルがあります。
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列awk
ORを使用し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