Como posso remover termos exponenciais e números de ponto flutuante de um arquivo de texto no linux?

1

Qual expressão regular devo usar para remover termos numéricos exponenciais e números de ponto flutuante de um arquivo de texto?

Por exemplo, tenho os seguintes termos no meu arquivo:

-0.161678
relational
0.081827
5.936420e-01
-0.155506
Favori54
0.086938
1.187284e+00
-0.149283
0.091921
"External"
1.780926e+00
-0.143025

Gostaria que meu arquivo incluísse apenas as seguintes linhas:

relational
Favori54
"External"
    
por Umit Karabiyik 27.09.2013 / 20:07

3 respostas

0

Parece-me que você quer linhas que comecem com qualquer coisa mas um dígito ou o sinal de menos. Isso vai te dar isso:

grep '^[^0-9,-]' file.txt
    
por 27.09.2013 / 21:04
0
awk '/^[+-]?[0-9]+\.?[0-9]*([Ee][+-]?[0-9]+)?$/ { next }
     /^[+-]?\.[0-9]+([Ee][+-]?[0-9]+)?$/ { next }
     { print }' yourfile

A parte mantissa do número, pode começar com um ponto ou terminar com um ponto, mas não pode ser apenas um ponto: . não é válido e adicionar um expoente como .E3 não o torna válido. 0. e .0 são válidos, com ou sem um expoente. O expoente pode ser em maiúscula ou minúscula e e pode ter um sinal + explícito.

Observe que isso não pressupõe espaços em branco em torno dos valores de ponto flutuante. Também corresponde a valores inteiros. Além disso, ele passa por itens que diferem da notação de ponto flutuante com caracteres indesejados ou o que for, como 1E+ , 1.0A ou .0E+33x . Note que alguns destes exemplos têm uma notação de ponto flutuante como um prefixo válido .

As duas expressões regulares podem ser combinadas para evitar a repetição da parte do expoente comum e a ação da regra comum. O resultado é ainda menos legível.

Por último, { print } pode ser "code golfed" até apenas 1 . A expressão 1 é booleana true e a ação padrão do awk para uma condição verdadeira ou padrão correspondente é { print } .

    
por 16.12.2015 / 23:33
-1

Tente isto:

awk '{if($1+0!=$1) print $0}' filename.txt

    
por 28.09.2013 / 17:43