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
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"
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
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 }
.
Tente isto:
awk '{if($1+0!=$1) print $0}' filename.txt
Tags command-line linux