Excluir linhas com valor abaixo (ou acima) do limite

Excluir linhas com valor abaixo (ou acima) do limite

Meu arquivo está assim:

AA  110 B   10   ..  BB  15   ... BBB 20   D   F   25   D   D
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F
AA  112 C    2   ..  BB   3   ... BBB  0   D   F    0   D   F
AA  120 D    2   ..  FF   3   ... FFF  3   D   F    3   D   D

Gostaria de excluir linhas contendo um valor =< 10 em qualquer uma das colunas. Estou ciente do uso de sede, awk '$3 !=< 10'mas isso excluiria apenas linhas no terceiro campo. Existe uma maneira de dizer ao qwk para considerar todas as colunas?

Responder1

perlpara o resgate

$ cat ip.txt 
AA  110 B   10   ..  BB  15   ... BBB 20   D   F   25   D   D
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F
AA  112 C    2   ..  BB   3   ... BBB  0   D   F    0   D   F
AA  120 D    2   ..  FF   3   ... FFF  3   D   F    3   D   D

$ perl -ae 'print if !(grep { $_ <= 10 && /^\d+$/ } @F)' ip.txt 
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F
  • -adivida a linha de entrada no espaço e salve no @Farray
  • grep { $_ <= 10 && /^\d+$/ } @Fobtenha todos os elementos do @Farray que são feitos apenas de dígitos e cujo valor é<= 10
  • em seguida, imprima linhas se grep retornar 0. O ()around grepsignifica que retornará a contagem de correspondências em vez dos próprios elementos

Vamos testar outra condição:

$ perl -ae 'print if !(grep { $_ < 10 && /^\d+$/ } @F)' ip.txt 
AA  110 B   10   ..  BB  15   ... BBB 20   D   F   25   D   D
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F


Certas condições, como nesta questão, greptambém podem ser resolvidas (o que provavelmente é mais rápido que perla solução)

$ grep -vw '[0-9]\|10' ip.txt 
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F

$ grep -vw '[0-9]' ip.txt 
AA  110 B   10   ..  BB  15   ... BBB 20   D   F   25   D   D
AA  111 B   50   ..  BB  55   ... BBB 30   F   F   45   F   F
  • -vlinhas diferentes do padrão correspondente
  • -wcorresponder apenas a palavras inteiras

Responder2

No awk, você pode usar algo como for (i = 1 ; i <= NF ; i++) { ... }fazer um loop em todos os campos de uma linha. Com isso, algo como:

awk '{for(i = 1 ; i <= NF ; i++) { 
         if ($i ~ /^[0-9]+$/ && $i <= 10) { next };
       } 
     } 1'  < input

$i ~ /^[0-9]+$/verifica se o campo é só de dígitos, e depois é comparado com 10, passando para o nextregistro (linha) se for menor ou igual a 10.

Responder3

isso é para sed

sed -rn '/\b([0-9]|10)\b/!p' file

informação relacionada