awkで複数の列の累積合計を取得するには?

awkで複数の列の累積合計を取得するには?

次のようにパイプで区切られたファイルがあります。

KALPESH|100|200|300
KALPESH|200|300|400
KALPESH|300|400|500
KALPESH|400|500|600

私は以下を使用しています:

awk -F"|" '{ name[$1]+=$2 } END { for (c in name) print c"|"name[c] }' earning1

これにより、列2の結果が得られます。たとえば、次のようになります。

KALPESH|1000

各列に対してこれを実行してからjoinコマンドを使用する必要がありますが、3つの列すべての累積合計が必要です。たとえば、次のようになります。

KALPESH|1000|1400|1800

単一awkでこれを達成できますか?

ベストアンサー1

このような作業には、次のようなより専門的なツールが好まれます。datamash

$ datamash -t '|' -g 1 sum 2 sum 3 sum 4 < file
KALPESH|1000|1400|1800

またはcsvsqlツールcsvkit:

$ csvsql -H -d'|' --query '
    select a,sum(b),sum(c),sum(d) from file group by a' file | csvformat -D'|'

a|sum(b)|sum(c)|sum(d)
KALPESH|1000|1400|1800

おすすめ記事