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. 入力は複数の数字(デフォルトでは単一行)を持つレコードで構成されるため、個々の数字を一緒に追加する方法でレコードを処理する必要があります。つまり、に加えることはできませんが、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'

関連情報