Linux

使用 awk 對 while 循環值求和時遇到問題

  • November 24, 2019

我試圖在腳本末尾得到總和 ,36962以呼應$TOTAL,但我無法讓它工作。有什麼建議嗎?這是一個學校項目,我對 Bash 很生疏。

TOTAL=0
while read p; do
   awk '{ if ($1 > 100 ) print TOTAL+=$1}'
   echo $TOTAL
done < ipuniq.txt
  • 6578
  • 6723
  • 32735
  • 36962
  • 迴聲 -> 0

TOTAL變數是一個shell變數,因此awk不會知道它。在您的awk命令中,TOTAL變數在每次迭代中都未設置,因此每次都將其重置為單個值,然後列印。

awk此外,在這樣的循環中使用似乎毫無意義。

awk可以使用以下 1 行自己執行此操作:

awk '$1 > 100 { total+=$1 } END { print total }' ipuniq.txt

不需要循環或其他命令。


但是,如果您的作業要求您使用 bash/shell,您可以這樣做:

total=0
while read -r p _; do
   ((p>100)) && total=$((total+p))
done < ipuniq.txt
echo "$total"

這將使用 shell 算術表達式來檢查 的值p是否大於 100,如果是,則將其添加到total.

另外注意:我已在-r您的命令中添加了該選項,read因為這將按字面意思列印反斜杠(您的案例可能不需要,但我更喜歡一直使用-r,除非我特別有理由不這樣做。)

我還添加了_參數名稱,這將防止p被設置為不需要的輸入。 read會將所有剩餘單詞分配給最後一個參數,因此在您的情況下,假設您的文件包含數字和 IP,例如:

1 10.10.10.10
2 10.10.10.11

如果沒有參數來捕捉雜物,p將設置為:

p='1 10.10.10.10'

然後:

p='2 10.10.10.11'

引用自:https://unix.stackexchange.com/questions/552477