ファイル内の各列の合計です。ファイル内の列数だけ処理するには柔軟性が必要です。

ファイル内の各列の合計です。ファイル内の列数だけ処理するには柔軟性が必要です。

こんにちは。ファイル内の各列の合計を取得する必要があり、特定のファイルでできるだけ多くの列を処理できる柔軟性が必要です。

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

awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print sum[i];}'

ただし、これは最初の列の合計のみを提供するので、はっきりと繰り返すことができますが、より簡単なものを好みます。

どんなアイデア/答えがありますか?

答え1

それする列あたりの合計を提供しますが、1列に提供します(データがスペースで区切られている場合)。

$ cat data.in
1 2
3 4
5 6

$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i] }' data.in
12 
9 

だからこれは問題です。各合計の間に改行文字を出力しないでください。

$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) printf("%d ", sum[i]); printf("\n") }' data.in
12 9

このprintf()関数はフォーマット文字列を使用します。%d整数(浮動小数点数の場合)の形式文字列で、整数の%f後に次の空白が出力されます。次に、ループの後に明示的な改行文字を出力します。

ORS別の回避策は、(「出力レコード区切り記号」)変数を使用することです。

$ awk 'BEGIN { ORS=" " } { for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i]; printf("\n") }' data.in
12 9

Awkの連想配列のキー順序の以下の説明では、Dave Thompsonの洞察力のある警告も参照してください(順序は保証されていません)。

答え2

perl -lane '$sum[$_] += $F[$_] for 0..$#F; END {print join $", @sum}' data.in

関連情報