Remover linhas com critérios

1. Remover linhas com critérios

Helder
helderfe

(usa Ubuntu)

Enviado em 07/01/2021 - 14:40h

Fala aí, galera!

Estou precisando de uma ajudinha! Tenho um arquivo com 15 colunas e mais de 10000 linhas. Eu preciso, então, excluir as linhas que tiverem mais de 11 NaN. Como posso proceder neste caso? Segue um exemplo de parte dos dados.

1.00 1.00 1.00 1.00 1.00 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN
0.95 NaN 1.00 NaN 0.92 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN 0.96 NaN 0.97 NaN NaN NaN NaN NaN NaN 0.91 NaN NaN NaN
0.99 NaN 1.00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.97 NaN
0.98 0.97 0.98 0.97 0.96 0.97 0.99 0.99 0.97 1.00 NaN 0.85 NaN 0.98 0.97


Então restaria apenas a primeira e a última linha.

Grato!


  


2. Re: Remover linhas com critérios

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/01/2021 - 17:35h

helderfe escreveu:

Fala aí, galera!

Estou precisando de uma ajudinha! Tenho um arquivo com 15 colunas e mais de 10000 linhas. Eu preciso, então, excluir as linhas que tiverem mais de 11 NaN. Como posso proceder neste caso? Segue um exemplo de parte dos dados.

1.00 1.00 1.00 1.00 1.00 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN
0.95 NaN 1.00 NaN 0.92 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN 0.96 NaN 0.97 NaN NaN NaN NaN NaN NaN 0.91 NaN NaN NaN
0.99 NaN 1.00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.97 NaN
0.98 0.97 0.98 0.97 0.96 0.97 0.99 0.99 0.97 1.00 NaN 0.85 NaN 0.98 0.97

Então restaria apenas a primeira e a última linha.
Grato!

Boa tarde Helder.
Usei o "texto" do seu exemplo para testar.
Segue sugestão:
awk '{count=0;for(n=1;n<=NF;n++) {if($n~/NaN/) count++;} {if(count<12)printf "NR %s: Count %s: %s\n" ,NR,count,$0}}' texto-02
NR 1: Count 9: 1.00 1.00 1.00 1.00 1.00 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN
NR 5: Count 2: 0.98 0.97 0.98 0.97 0.96 0.97 0.99 0.99 0.97 1.00 NaN 0.85 NaN 0.98 0.97


Inicia um laço para registro e checa campo a campo,
se ~ /NaN/, acrescenta 1 em "count" ,
Se count<12, "mostra a linha.
Contando os campos com Números.
awk '{count=0;for(n=1;n<=NF;n++) {if($n~/[0-9.]+/) count++;} {if(count>=4)printf "NR %s: Count %s: %s\n" ,NR,count,$0}}' texto-02
NR 1: Count 6: 1.00 1.00 1.00 1.00 1.00 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN
NR 5: Count 13: 5.00 0.97 0.98 0.97 0.96 0.97 0.99 0.99 0.97 1.00 NaN 0.85 NaN 0.98 0.97

Obs.: Para efeito de testes, a saída mostra o Nº do Registro e o valor de count.

______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:
Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.

______________________________________________________________________



3. Re: Remover linhas com critérios

Helder
helderfe

(usa Ubuntu)

Enviado em 07/01/2021 - 19:02h

Pow, que massa! Obrigado! É possível ver o número das linhas que foram excluídas?


4. Re: Remover linhas com critérios

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/01/2021 - 19:45h

helderfe escreveu:

Pow, que massa! Obrigado! É possível ver o número das linhas que foram excluídas?

Sim, é possível.
Só complementar o printf...
... ;else printf "Excluida\n" ...
Tenta fazer.....


______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________