%20del%20umbral.png)
Mi archivo se ve así:
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
Me gustaría eliminar líneas que contengan un valor =< 10 en cualquiera de las columnas. Soy consciente del uso de sed
y awk '$3 !=< 10'
pero esto solo eliminaría líneas en el tercer campo. ¿Hay alguna manera de decirle a qwk que considere todas las columnas?
Respuesta1
perl
al rescate
$ 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
dividir la línea de entrada en el espacio y guardarla en@F
una matrizgrep { $_ <= 10 && /^\d+$/ } @F
obtener todos los elementos de@F
la matriz que están hechos solo de dígitos y cuyo valor es<= 10
- luego imprima líneas si grep regresa
0
. Around significa()
quegrep
devolverá el recuento de coincidencias en lugar de los elementos en sí.
Probemos otra condición:
$ 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
Ciertas condiciones, como en esta pregunta, también se pueden resolver grep
(lo que probablemente sea más rápido que perl
la solución)
$ 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
líneas distintas al patrón coincidente-w
unir solo palabras completas
Respuesta2
En awk
, puedes usar algo como for (i = 1 ; i <= NF ; i++) { ... }
recorrer todos los campos en una línea. Con eso, algo como:
awk '{for(i = 1 ; i <= NF ; i++) {
if ($i ~ /^[0-9]+$/ && $i <= 10) { next };
}
} 1' < input
$i ~ /^[0-9]+$/
comprueba si el campo tiene solo dígitos y luego se compara con 10
, moviéndose al next
registro (línea) si es menor o igual a 10.
Respuesta3
esto es para sed
sed -rn '/\b([0-9]|10)\b/!p' file