Converte números de ponto flutuante em números decimais

3

Eu tenho várias tabelas 'ascii' em um diretório, algumas delas têm números expressos em decimal e outros em ponto flutuante, como segue:

1 1 1423
1 2 1589
1 3 0.85e 5
1 4 0.89e 4
1 5 8796
...

Existe uma maneira de converter todo o valor das tabelas em números decimais? Ouvi dizer que o uso de tr editor pode ser útil, mas não consigo descobrir como operar a conversão.

    
por steve 16.10.2015 / 13:54

4 respostas

3

O script sed elimina o espaço após o 'e', e o script awk apenas imprime cada campo (multiplicando $ 3 por 1 para "convertê-lo" para um número decimal não-fp):

$ sed -e 's/e /e/g' file | awk '{print $1, $2, $3 * 1}'
1 1 1423
1 2 1589
1 3 85000
1 4 8900
1 5 8796

Isso pressupõe que os números de ponto flutuante no arquivo:

  1. tem um espaço estranho após o 'e'
  2. omite o '+' para expoentes positivos
  3. não tem expoentes realmente grandes, caso contrário, awk os imprime como fp.

É possível obter awk para fazer a transformação / e / e / '(assim, sed não é necessário), mas está ficando tarde e meu cérebro está cansado. sed | awk é fácil e funciona.

    
por 16.10.2015 / 14:27
2

Isso fará a conversão:

awk '{print $1, $2, $3 * 10**$4}' file.csv

Assumindo:

  1. Existe um espaço entre oe e o expoente real.
  2. O expoente é o último campo de cada linha.

Se um formato específico for necessário, alguma forma de printf poderia ser usada.

Por exemplo:

awk '{printf( "%s %s %g "ORS,$1,$2,$3*10**$4)}' file.csv

poderia imprimir isso:

1 1 1423 
1 2 1589 
1 3 85000 
1 4 8900 
1 5 8796 
2 8 2.589e+28

Última linha adicionada para mostrar o formato final para grandes expoentes.

    
por 16.10.2015 / 22:24
2
{ sed 's/ /+/3' | xargs printf '%G% G% G\n'; } <in >out
1 1 1423
1 2 1589
1 3 85000
1 4 8900
1 5 8796

Você vai querer brincar com os sinalizadores %G de precisão se os números ficarem muito maiores do que isso.

    
por 16.10.2015 / 14:48
1

Outra variante com awk sprintf

awk 'NF==4{$(NF-1)=sprintf(CONVFMT, $(NF-1)$NF);NF=3}1' file
    
por 16.10.2015 / 14:36