「{$total=$total+$1}」で$1の値が変わるのはなぜですか?

「{$total=$total+$1}」で$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値を2倍にします$0。設定を使用すると、$0値も変更されます$1


達成することは、最初のフィールドのすべての値を一緒に追加することです。これは次のことで達成できます。

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

a各行は$1変数値に値を加算します。

関連情報