AWK 合計を計算する方法

AWK 合計を計算する方法

入力ファイル (FileInput.txt):

10 20 3 100 5 3 27

これは私のawkスクリプトです:

BEGIN{ while((getline line < "FileInput.txt") > 0) { }

合計を数えるにはどうすればいいですか? 試してみましたsum+=lineが、最初の列のみの合計になります。

答え1

次のようなものが機能します:

awk 'BEGIN {sum=0} {for (i = 1; i <= NF; i++) sum+=$i} END {print sum}' FileInput.txt

答え2

あなたのコードの問題は 2 つあります:

  1. awk実際には、通常の方法では使用されません。ブロック内のファイルの行を明示的にループします。これは、各入力レコード (行) に対して実行されるブロックの (オプションの) パターンまたは条件を提供するという、BEGIN通常のプログラム記述方法とは異なります。awk
  2. 入力は複数の数値を持つレコード(デフォルトでは 1 行)で構成されているため、個々の数値が合計されるようにこれらのレコードを処理する必要があります。つまり、20 3に追加することはできませんが、まずsumと に分割する必要があります。203

GNUawkまたはではmawk、レコード区切り文字RSを、デフォルトの改行文字の代わりに任意の空白文字のシーケンスに一致する正規表現に設定できます。これにより、 はawkファイルを空白で区切られた単一フィールド レコードのコレクションとして読み取ります。これらを合計して最後に合計を出力するのは簡単です。

$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168

あるいは、

$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168

あるいは、ロメオ・ニノフが示すものこれは各行のフィールドをループするものであり、

$ awk '{ for (i = 1; i <= NF; ++i) sum += $i } END { print sum }' file
168

答え3

ファイルを変換して、1 行に 1 つの数字が含まれるようにすることができます。

tr -s '[:blank:]' '\n' < FileInput.txt

次に解決策を選択しますhttps://stackoverflow.com/q/2702564/7552それらを合計します。例えば

tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'

関連情報