Excluir linhas com valor abaixo (ou acima) do limite

4

Meu arquivo é 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 que contenham um valor = < 10 em qualquer uma das colunas. Estou ciente do uso de sed e awk '$3 !=< 10' , mas isso só excluiria linhas no terceiro campo. Existe uma maneira de dizer ao qwk para considerar todas as colunas?

    
por AP38 22.09.2016 / 15:33

3 respostas

7

perl para 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
  • -a divide a linha de entrada no espaço e salva em @F array
  • grep { $_ <= 10 && /^\d+$/ } @F obtém todos os elementos da matriz @F que são feitos apenas de dígitos e cujo valor é <= 10
  • imprima as linhas se o grep retornar 0 . O () em torno de grep significa que ele retornará a contagem de correspondências em vez de os 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 pergunta, podem ser resolvidas com grep também (o que provavelmente é mais rápido que perl solution)

$ 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
  • -v linhas diferentes de padrão de correspondência
  • -w corresponde apenas a palavras inteiras
por 22.09.2016 / 15:44
7

Em awk , você pode usar algo como for (i = 1 ; i <= NF ; i++) { ... } para percorrer todos os campos em 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 é apenas dígitos e depois é comparado a 10 , movendo para o registro next (linha) se menor ou igual a 10.

    
por 22.09.2016 / 15:54
0

isto é para sed

sed -rn '/\b([0-9]|10)\b/!p' file
    
por 22.01.2017 / 19:55

Tags