AWK one-liner para processar um arquivo com diferentes números de campos [closed]

0

O que eu estou tentando fazer é criar um pequeno roteiro, na verdade, eu sei que é possível fazer um one-liner. Eu tenho um arquivo grande contendo diferentes números de campos. E o que eu quero fazer é somar o último campo em cada registro se for um número com um ponto decimal ... E para imprimir o resultado com o printf com um espaço reservado "% f \ n" ...

    
por G. ILL 10.04.2018 / 01:37

1 resposta

2

Para somar os últimos campos que têm uma vírgula decimal (ponto) neles:

awk '$NF ~ /\./ { sum += $NF } END { printf("%f\n", sum ) }' file.in

Ou seja, se os dados do último campo ( $NF ) tiverem um ponto, suponha que seja um número e adicione-o a sum . No final, imprima a soma com o formato especificado na pergunta.

Observe que isso ignorará os inteiros no último campo.

O seguinte permitirá que awk tente usar o último campo como um número, independentemente do que realmente seja. Isso significa que 1 será interpretado como 1 e que 1.2 será interpretado como 1,2. As strings hello e boo serão zero, enquanto 123abc serão consideradas 123.

awk '{ sum += $NF } END { printf("%f\n", sum) }'

O seguinte não adicionará campos que contenham algo diferente de dígitos, pontos, vantagens e desvantagens:

awk '$NF ~ /^[-+0-9.]*$/ { sum += $NF } END { printf("%f\n", sum) }'

Ele ainda aceitará 09+99... (como 9), mas os números de pontos flutuantes correspondentes não são triviais e dependem do formato que você precisa corresponder. Veja por exemplo estes exemplos no site da RegExLib para obter padrões mais úteis.

    
por 10.04.2018 / 12:04

Tags