número de análise no awk

6

Eu tenho um arquivo de texto com números na segunda coluna e os números têm um separador de milhar e um separador decimal:

2014-01     2,277.40
2014-02     2,282.20
2014-03     3,047.90
2014-04     4,127.60
2014-05     5,117.60    

Eu preciso somar os números, mas a seguinte sintaxe awk não funciona:

awk '{X=X+$2} END {print X}' file

Retorna 16 , o que obviamente está errado. Como posso informar awk para ler o número como 2277.40 em vez de 2,277.40 ?

    
por Martin Vegter 08.02.2014 / 20:50

4 respostas

7

Observe que, embora seja necessário remover as vírgulas de sua entrada antes de adicionar os valores ao total, mas awk tem a satisfação de imprimir seus resultados com ou sem separadores de milhares. Por exemplo, se você usar o seguinte código: veja a variável fmt definida no código.

Sua entrada:

$ cat file
2014-01     2,277.40
2014-02     2,282.20
2014-03     3,047.90
2014-04     4,127.60
2014-05     5,117.60    

Código Awk:

$ awk '{gsub(/,/,"",$2);sum+=$2}END{printf(fmt,sum)}' fmt="%'6.3f\n" file

Resultante:

16,852.700

Se você quiser tentar isso em um sistema Solaris/SunOS , altere awk no início deste script para /usr/xpg4/bin/awk , /usr/xpg6/bin/awk ou nawk .

Espero que isso seja útil.

    
por 17.02.2014 / 19:44
11

Basta remover as vírgulas do campo que você está analisando:

awk '{sub(",", "", $2); X+=$2} END {print X}' file

Isso começou como uma solução rápida e suja, mas parece que não há outra maneira. Do Manual do AWK :

A string is converted to a number by interpreting a numeric prefix of the string as numerals: "2.5" converts to 2.5, "1e3" converts to 1000, and "25fix" has a numeric value of 25. Strings that can't be interpreted as valid numbers are converted to zero.

E, embora o formato da conversão de número para string possa ser definido por meio da variável CONVFMT , não há essa opção para conversões de string para número. [1]

Até mesmo o strtonum de gawk () , ao mesmo tempo em que homenageia separador decimal definido pelo código de idioma do sistema, ignora (isto é, corta em) mil separadores.

    
por 08.02.2014 / 21:10
3

Eu gosto de usar bc para coisas como esta. É claro que você só está adicionando, mas esse padrão é útil se você precisar fazer coisas mais sofisticadas que exijam bc para fazer os cálculos.

$ paste -s -d+ <(awk '{gsub(/,/,"",$2); print $2}' sample.txt) | bc
16852.70
    
por 08.02.2014 / 23:33
2

@Martin Vegter deve ser mawk então você está recebendo erro, veja se eu posso produzir o mesmo erro

[akshay@aix tmp]$ awk -vfmt="%'6.3f\n" 'BEGIN{sum=12052255;printf(fmt,sum)}'
12,052,255.000

[akshay@aix tmp]$ mawk -vfmt="%'6.3f\n" 'BEGIN{sum=12052255;printf(fmt,sum)}'
mawk: run time error: improper conversion(number 1) in printf("%'6.3f")
FILENAME="" FNR=0 NR=0

[akshay@aix tmp]$ which awk
/bin/awk

[akshay@aix tmp]$ which mawk
/usr/bin/mawk

Instale gawk e tente

    
por 20.02.2014 / 05:36

Tags