Imprime somente linhas que são completamente numéricas

3

Gostaria de filtrar por um arquivo de texto e somente imprimir as linhas em que cada coluna é um número de ponto flutuante válido. Por exemplo:

3 6 2 -4.2 21.2 
3 x 4.2 21.2 
3 2 2.2.2

Apenas a primeira linha passaria como x , nem 2.2.2 são flutuantes válidos. Eu posso escrever um script python que simplesmente .splits() e executa um bloco try/except sobre cada parte, mas isso é lento para arquivos maiores. O arquivo de entrada tem um número de colunas de comprimento variável desconhecido e nenhuma notação científica será usada. Existe uma solução awk ?

    
por Hooked 22.10.2012 / 22:05

3 respostas

4

awk '
    # skip any obvious stuff
    /[^0-9. -]/ {next}
    {
        # test each field for a number
        for (i=1; i<=NF; i++) 
            if ($i + 0 != $i)
                next
        print
    }
'

Isso será quebrado para números válidos em notação científica: 1.2e1 == 12

    
por 22.10.2012 / 23:06
2

Tente algo assim:

$ cat data.txt 
3 6 2 -4.2 21.2 
3 x 4.2 21.2 
3 2 2.2.2

$ awk '/^\s*(-?[0-9]+(\.[0-9]*)?\s+)+\s*$/ { print }' < data.txt 
3 6 2 -4.2 21.2 
    
por 22.10.2012 / 22:39
1

com base nas condições em que você expressa o regex pode ser uma possibilidade. Consegui obter o seguinte script GNU awk para trabalhar no RHEL.

 awk '{for (i=1; i<=NF; ++i) {if ($i !~ /^[-]?[[:digit:]]+(\.[[:digit:]]+)?$/) break;if (i == NF)print($0)}}' file.txt
    
por 22.10.2012 / 22:38