ファイル内の各列の合計。ファイル内の列の数に応じて柔軟に対応する必要があります。

ファイル内の各列の合計。ファイル内の列の数に応じて柔軟に対応する必要があります。

こんにちは、ファイル内の各列の合計を取得する必要があります。任意のファイル内の列の数に応じて柔軟に対応する必要があります。

現在使用しているもの:

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("Output Record Separator") 変数を使用することです。

$ 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

関連情報