operação matemática em uma segunda coluna

0

Suponha que meu arquivo original tenha esta aparência:

            N O D E   O U T P U T

THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT
   NODE FOOT-   NT11     
        NOTE

      3       20.00     
     11       20.00     
   1003       23.75     
   1011       23.75     
   2003       27.52     
   2011       27.52     
   3003       31.30     
   3011       31.30     
   4003       35.08     

Eu preciso produzir um segundo arquivo, mas apenas com os valores da segunda coluna multiplicados por 100. Como eu poderia conseguir isso?

    
por Andrés F 02.08.2018 / 12:55

3 respostas

2

Supondo que você deseja preservar as larguras de campo e os formatos do bloco de dados numéricos, sugiro algo como

awk '
  $1 ~ /[0-9]+/ && $2 ~ /[-+0-9.]+/ {
    $0 = sprintf("%6d%12.2f", $1, 100*$2)
  } 1
' file

Ex.

$ awk '$1 ~ /[0-9]+/ && $2 ~ /[-+0-9.]+/ {$0 = sprintf("%6d%12.2f", $1, 100*$2)} 1' file
            N O D E   O U T P U T

THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT
   NODE FOOT-   NT11     
        NOTE

     3     2000.00
    11     2000.00
  1003     2375.00
  1011     2375.00
  2003     2752.00
  2011     2752.00
  3003     3130.00
  3011     3130.00
  4003     3508.00
    
por 02.08.2018 / 13:43
1

Eu escolheria interpretar a solicitação como produzindo uma saída que consiste unicamente nos números da segunda coluna, multiplicados por 100.

Isso pressupõe que o cabeçalho é estático e sempre com seis linhas de comprimento. Isso será ignorado.

$ awk 'FNR > 6 { print 100*$2 }' <infile
2000
2000
2375
2375
2752
2752
3130
3130
3508

A condição FNR > 6 acionará o bloco que multiplica e produz o segundo campo quando pelo menos seis linhas tiverem sido lidas.

Se você não sabe quanto tempo o cabeçalho é, você pode em vez de FNR > 6 usar $2 ~ /^-?[0-9.]+$/ , que é uma maneira ingênua de testar se o segundo campo é um número de ponto flutuante, opcionalmente assinado ("um opcional - seguido por apenas dígitos e pontos").

    
por 02.08.2018 / 13:48
0

Digamos que sua saída seja salva em um arquivo chamado 'outfile', eis outra solução - embora um aviso seja o de que ela não preserva a formatação das colunas com dados numéricos.

awk '{if(/^ *[0-9\.]+ *[0-9\.]+ *$/) {var=$2*100; print $1,var;} else { print $0 }}' outfile
    
por 02.08.2018 / 13:12