Eu tenho um arquivo simples com alguns valores numéricos:
2018-11-15 14:07:22 37.672 20.553 15.90 4.0
2018-11-17 09:15:46 37.519 20.692 13.80 4.0
2018-11-17 20:33:18 37.540 21.712 9.50 4.2
2018-11-18 05:18:02 37.391 20.516 0.00 4.3
2018-11-18 06:06:44 37.556 20.268 0.00 4.3
2018-11-19 05:56:51 37.565 20.678 14.60 4.2
2018-11-19 13:05:56 37.179 20.580 6.10 5.1
2018-11-19 16:16:41 37.167 20.571 0.10 4.0
Só quero imprimir a terceira e a quarta colunas com uma casa decimal. Por esse motivo eu faço:
awk '{printf "%.1f %.1f\n",$3,$4}' myfile
O problema é que me dá os valores com zeros na parte decimal (esta saída é apenas um exemplo, não é a saída da entrada):
37,0 20,0
37,0 20,0
40,0 28,0
34,0 26,0
40,0 20,0
34,0 26,0
34,0 26,0
39,0 24,0
37,0 20,0
39,0 24,0
36,0 21,0
37,0 20,0
37,0 20,0
37,0 20,0
Eu realmente não sei o que está acontecendo...
Minha localidade é:
decimal_point=","
thousands_sep="."
grouping=-1;-1
numeric-decimal-point-wc=44
numeric-thousands-sep-wc=46
numeric-codeset="UTF-8"
Responder1
Conforme sugerido nos comentários, sua localidade define a vírgula como o separador decimal correto, e é isso que seu awk parece usar.
ODocumentação GNU awkafirma que o padrão exige isso, mas (como aqui), muitas vezes é considerado mais um problema, então o GNU awk não faz isso por padrão, apenas no modo POSIX ou se solicitado com a --use-lc-numeric
opção.
$ LC_ALL=fi_FI.UTF-8 gawk '{printf "%.1f %.1f\n",$3,$4}' myfile |head -2
37.7 20.6
37.5 20.7
mas
$ LC_ALL=fi_FI.UTF-8 POSIXLY_CORRECT=1 gawk '{printf "%.1f %.1f\n",$3,$4}' myfile |head -2
37,0 20,0
37,0 20,0
Claro, seu awk pode ter costumes diferentes, e o manual também menciona que versões mais antigas do GNU awk também estavam em conformidade com o padrão aqui.
Verifique a documentação do awk que você está usando ou apenas configure LC_NUMERIC=C
ao executá-lo para forçar a localidade padrão.