Por que o valor de $ 1 foi alterado em '{$ total = $ total + $ 1}'?

2

Eu escrevi um comando awk para tentar contar o valor total de uma coluna específica, mas algo inesperado aconteceu:

# 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

Aparentemente, o valor de $1 foi alterado após $total=$total+$1 .
Mas acho que não reatribui valor para $1 , porque mudou inesperadamente, como consertá-lo?

    
por Zen 16.10.2015 / 06:39

1 resposta

6

Em awk , você precisa fazer referência a um pacote sem o sinal $ , somente total , não $total .

Na declaração awk :

$total=$total+$1

awk expandiu isso para (observe que a variável total está definida como 0 no bloco BEGIN{} ):

$0=$0+$1

Você alterou o valor $0 para o valor de si mesmo mais o campo primeiro valor (que é o mesmo), portanto, $0 está definido como o dobro do valor de $0 . Ao definir $0 , você também alterou o valor de $1 .

O que você deseja alcançar é somar todos os valores do primeiro campo. Isso pode ser conseguido desta maneira:

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

Para o valor da variável a , o valor de $1 é adicionado em cada linha.

    
por 16.10.2015 / 07:43