为什么 $1 的值在 `{$total=$total+$1}` 中发生了变化?

为什么 $1 的值在 `{$total=$total+$1}` 中发生了变化?

我编写了一个awk命令尝试计算特定列的总值,但发生了意想不到的事情:

# THE CONTENT OF TEST FILE
1
2
3
4

# MY AWK COMMAND
awk 'BEGIN {total=0} {print $1; $total=$total+$1; print $1, $total} END {print $total}' test

# RESULT
1
2 2
2
4 4
3
6 6
4
8 8
8

显然, 的值$1在 后发生了变化$total=$total+$1
但我认为我没有重新分配 的值$1,为什么它意外地改变了,如何修复它?

答案1

awk必须引用不带$符号的变量,仅total,而不$total

在那份awk声明中:

$total=$total+$1

awk将其扩展为(注意变量在块中total设置为):0BEGIN{}

$0=$0+$1

因此,您将$0值更改为自身的值加上值第一个字段(这是相同的),因此$0设置为 值的双倍$0。通过设置,$0您还更改了 的值$1


您想要实现的是将第一个字段的所有值加在一起。这可以通过以下方式实现:

awk '{a+=$1;print a}' file

a每行将的值$1添加到变量的值中。

相关内容