gawk: Soma dos floats formatados com separador de vírgulas

2

Estou tentando somar os floats que usam a vírgula como separador, e o gawk faz cálculos com números inteiros. Aqui está o script:

BEGIN {
  FS=";"
  OFS=";"
  CONVFMT = "%2.2f"
}
{ 
  print $1
  print $2
  print $1+$2 
}

Estou usando este arquivo de dados:

4,3;5,7

e chamando o script assim:

LC_ALL=fr_BE gawk -f test.awk < t.txt

Eu recebo esta saída:

4,3
5,7
9

Eu tenho a localidade fr_BE configurada, mas o resultado ainda está incorreto. Como posso consertar isso?

    
por user300811 23.03.2014 / 11:09

2 respostas

4

A resposta é usar a opção --use-lc-numeric gawk.

--use-lc-numeric

This forces gawk to use the locale's decimal point character when parsing input data. Although the POSIX standard requires this behavior, and gawk does so when --posix is in effect, the default is to follow traditional behavior and use a period as the decimal point, even in locales where the period is not the decimal point character. This option overrides the default behavior, without the full draconian strictness of the --posix option.

Exemplo

Digamos que tenhamos este arquivo de dados:

$ cat t.txt 
4,3;5,7
4,9;5,7

Para facilitar a visualização da saída, alterei essa linha em test.awk :

print "Total: "$1+$2 

Agora, quando você executá-lo usando o switch acima mencionado:

$ LC_ALL=fr_BE gawk --use-lc-numeric -f test.awk < t.txt
4,3
5,7
Total: 10
4,9
5,7
Total: 10,60

Referências

por 23.03.2014 / 12:36
0

Acho que o problema é gawk não pode converter a string 4,3 em um número flutuante. Você pode corrigir isso substituindo , por . . Para entrada de @glenn jackman:

BEGIN {
  FS=";"
  OFS=";"
  CONVFMT = "%2.2f"
}
{
  gsub(",",".",$0)
  print $1
  print $2
  print $1+$2
}

$ LC_ALL=fr_BE gawk -f test.awk < file
4.3
5.7
10
4.9
5.7
10.6
    
por 23.03.2014 / 14:03

Tags