awk - arredondado para 2 casas decimais

4

Estou computando as porcentagens de cada item em uma coluna de um arquivo usando o seguinte comando awk:

awk '{a[NR]=;x+=(b[NR]=);c[NR]=}END{while(++i<=NR)print c[i]"\t"a[i]"\t"100*b[i]/x"%"}' file.txt > out_file.txt

arquivo.txt

N    38668442   
V    14008521   
ADJ  16112215   

out_file.txt

N    38668442   56,213%
V    14008521   20,3644%
ADJ  16112215   23,4226%

No entanto, gostaria que as porcentagens no out_file.txt fossem arredondadas para 2 decimais.

desejado out_file.txt

N    38668442   56,21%
V    14008521   20,37%
ADJ  16112215   23,42%

Referindo-se a esta postagem: link

Eu tentei integrar printf "%s,%d,%0.2f%\n no meu código, o que gera um erro de argumento, mesmo diminuindo os argumentos e limitando a expressão a %0.2f%\n .

 awk '{a[NR]=;x+=(b[NR]=);c[NR]=}END{while(++i<=NR)printf "%s,%d,%0.2f%\n",c[i]"\t"a[i]"\t"100*b[i]/x"%"}' file.txt > out_file.txt

Além disso, bc não funcionou. Por que não produz a saída desejada? Na minha opinião, deve funcionar como eu encontrei a expressão printf "%0.2f\n" em vários posts sobre o mesmo assunto. Eu sinto falta de algo trivial?

Eu aprecio muito qualquer ajuda ou sugestão!

    
por dani_anyman 14.04.2017 / 13:45

1 resposta

7

Você está entendendo mal a sintaxe do comando printf (que segue de perto o da função C subjacente: veja por exemplo man 3 printf para documentação completa).

printf tem uma sequência de formatos que consiste em uma sequência de especificadores de formato e outros caracteres literais, seguidos por tantos argumentos separados por vírgula quantos forem necessários para preencher o dado formato. Em seu comando

printf "%s,%d,%0.2f%\n",c[i]"\t"a[i]"\t"100*b[i]/x"%"

você está dizendo para esperar 3 valores (um %s , um %d e um %0.2f ), mas está dando a ele um único argumento concatenado de string c[i]"\t"a[i]"\t"100*b[i]/x"%" . Por isso, ficará sem argumentos durante a tarefa.

O que você supostamente pretendia é

printf "%s\t%d\t%0.2f%%\n", c[i], a[i], 100*b[i]/x

(as guias ficam dentro da string de formatação; o %% corresponde a um literal % , ou seja, impede que % seja interpretado como o início de outro especificador de formato).

    
por steeldriver 14.04.2017 / 14:35