$ echo '173.91,0.00%,36.10%,1.71'|perl -pe 's{\d+\.\d+%}{$&/100}eg'
173.91,0,0.361,1.71
O regex procura por um float com% e nas últimas chaves avalia a expressão: string $&
dividida por 100.
Eu tenho um arquivo CSV que tem porcentagens aqui e ali expressas em formato de texto, por exemplo
173.91,0.00%,36.10%,1.71
A questão do dia é como transformar esse exemplo em
173.91,0,0.3610,1.71
Editar para adicionar: você não deve confiar na posição dos campos de porcentagem. Você deve detectá-los com base no sinal%.
Veja um exemplo de awk
:
$ awk -F, '{sub(/%/,"",$2); sub(/%/,"",$3); \
printf("%.2f,%.0f,%.4f,%.2f\n"), $1, $2, $3/100, $4}' ex.txt
173.91,0,0.3610,1.71
awk
para dividir o conteúdo do arquivo ex.txt
usando vírgulas, -F,
. sub(/%/,"",$2)
& sub(/%/,"",$3)
tira os sinais de porcentagem. printf("%.2f,%.0f,%.4f,%.2f\n")
se encarrega de formatar tudo. printf
, $1
, $2
, $4
são apenas o conteúdo do arquivo, o terceiro, $3/100
que dividimos por 100 para obtê-lo na forma decimal. Uma coisa que podemos melhorar imediatamente, assumindo que não nos importamos com sinais de porcentagem, é removê-los completamente usando gsub
para substituí-los globalmente.
$ awk -F, '{sub(/%/,"",$0); \
printf("%.2f,%.0f,%.4f,%.2f\n"), $1, $2, $3/100, $4}' ex.txt
173.91,0,0.3610,1.71