%20do%20limite.png)
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 sed
e, awk '$3 !=< 10'
mas isso excluiria apenas linhas no terceiro campo. Existe uma maneira de dizer ao qwk para considerar todas as colunas?
Responder1
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
divida a linha de entrada no espaço e salve no@F
arraygrep { $_ <= 10 && /^\d+$/ } @F
obtenha todos os elementos do@F
array que são feitos apenas de dígitos e cujo valor é<= 10
- em seguida, imprima linhas se grep retornar
0
. O()
aroundgrep
significa 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, grep
também podem ser resolvidas (o que provavelmente é mais rápido que perl
a 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
-v
linhas diferentes do padrão correspondente-w
corresponder 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 next
registro (linha) se for menor ou igual a 10.
Responder3
isso é para sed
sed -rn '/\b([0-9]|10)\b/!p' file