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

答え2

datamash私は原則として@plumoを使用しますが、OPリクエストに固執し、友達がいると仮定するawkので、入力ファイルは次のようになります.KALPESHRAJESH

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

それから

awk -F\| '{
    flds=(NF>flds)?NF:flds; 
    nm[$1]=$1;
    for (f=2; f<=NF; f++) sum[$1"|"f]+=$f
  }END{
    for (n in nm) {printf "%s", n;
      for (f=2; f<=flds; f++) printf "%s", FS sum[n"|"f]; print""
  }
}' file

KALPESH|1000|1400|1800
RAJESH|1000|1400|1799

KALPESH別個でフィールド数が一定の場合、これは次のように縮小されます。

awk -F\| '{
    for (f=2; f<=4; f++) sum[f]+=$f
  }END{
    printf "%s", "KALPESH";
      for (f=2; f<=4; f++) printf "%s", FS sum[f]; print""
  }' file

それとも

awk -F\| '{s2+=$2; s3+=$3; s4+=$4}END{print "KALPESH" FS s2 FS s3 FS s4}' file

答え3

そう思います。 awkについてよく知らなくても、変数を使用して2番目の列の合計を追跡して、本文でこれを実行できます。名前拡張すると、すべての列の合計を計算できます。アイデアを提供:試してみて、ニーズに合わせて調整

awk -F"|" '{ total1 += $2; total2 += $3} END { print (total1, total2); }' earnings

正確に何をしたいのか明確ではありません。列1の内容は重要ですか?発生するすべてのイベントの総数が必要ですか、それとも常に同じでなければなりませんか?解決策はそのようなものに依存します。困難に直面したら教えてください。

関連情報