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