
輸入檔案(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
您的程式碼有雙重問題:
awk
它實際上並不像通常那樣使用。它明確地循環區塊中的檔案行BEGIN
。這不是人們通常編寫awk
程式的慣用方式,即為每個輸入記錄(行)執行的區塊提供(可選)模式或條件。- 由於輸入由具有多個數字的記錄(預設為單行)組成,因此您必須以將各個數字相加的方式來處理這些記錄。換句話說,您不能添加
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
您可以轉換文件,以便每行只有一個數字:
tr -s '[:blank:]' '\n' < FileInput.txt
然後從中選擇一個解決方案https://stackoverflow.com/q/2702564/7552對它們進行總結。例如
tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'