![使用 awk 对 while 循环值求和时遇到问题](https://linux22.com/image/164116/%E4%BD%BF%E7%94%A8%20awk%20%E5%AF%B9%20while%20%E5%BE%AA%E7%8E%AF%E5%80%BC%E6%B1%82%E5%92%8C%E6%97%B6%E9%81%87%E5%88%B0%E9%97%AE%E9%A2%98.png)
我试图让总和与脚本末尾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
答案1
该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'