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

Zen*_*Zen 2 awk text-processing

我写了一个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
Run Code Online (Sandbox Code Playgroud)

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

cha*_*aos 6

awk你必须引用一个没有$符号的变量时,只有total,不是$total

在该awk声明中:

$total=$total+$1
Run Code Online (Sandbox Code Playgroud)

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

$0=$0+$1
Run Code Online (Sandbox Code Playgroud)

因此,您将$0值更改为本身的值加上值第一个字段(相同),因此$0设置为$0. 通过设置,$0您还更改了 的值$1


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

awk '{a+=$1;print a}' file
Run Code Online (Sandbox Code Playgroud)

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