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

您的程式碼有雙重問題:

  1. awk它實際上並不像通常那樣使用。它明確地循環區塊中的檔案行BEGIN。這不是人們通常編寫awk程式的慣用方式,即為每個輸入記錄(行)執行的區塊提供(可選)模式或條件。
  2. 由於輸入由具有多個數字的記錄(預設為單行)組成,因此您必須以將各個數字相加的方式來處理這些記錄。換句話說,您不能添加20 3sum,但必須先將其拆分為203

使用 GNUawkmawk,我們可以將記錄分隔符 , 設定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'

相關內容