使用 awk 对 while 循环值求和时遇到问题

使用 awk 对 while 循环值求和时遇到问题

我试图让总和与脚本末尾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'

相关内容