awk: aritmética não funciona em um campo específico

0

Eu tenho várias linhas, como:

N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0

Eu preciso substituir o terceiro do último campo por um fator próprio que não funciona com awk . No entanto, se eu aplicar a mesma expressão no último campo ou até mesmo segundo do último campo, isso funciona. Eu testei separadamente com a notação científica e awk , funciona. Exemplos abaixo:

#works as expected; last field gets multiplied by -1
echo "N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0" | awk '{gsub($(NF),-1.0*$(NF))};{print}'
N2O       + M       = N2       + O     + M          1.300E+11  0.00  -59620

#does not work; third from last field stays unchanged
echo "N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0" | awk '{gsub($(NF-2),-1.0*$(NF-2))};{print}'
N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0

Alguma sugestão de por que isso está acontecendo?

    
por Ketan 25.01.2016 / 21:48

1 resposta

1

A resposta pode ser encontrada em man awk :

A numeric expression is converted to string by replacing expr with sprintf(CONVFMT, expr), unless expr can be represented on the host machine as an exact integer then it is converted to sprintf("%d", expr).
Sprintf() is an AWK built-in that duplicates the functionality of sprintf(3), and CONVFMT is a built-in variable used for internal conversion from number to string and initialized to "%.6g".

Portanto, enquanto você chama a função gsub , que opera com a string awk , converte o campo por sprintf("%d", 1.300E+11) em 130000000000 , mas não existe tal texto na linha, então nada substitui.     

por 26.01.2016 / 00:40