Eliminar líneas con valor por debajo (o por encima) del umbral

Eliminar líneas con valor por debajo (o por encima) del umbral

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 sedy 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

perlal 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
  • -adividir la línea de entrada en el espacio y guardarla en @Funa matriz
  • grep { $_ <= 10 && /^\d+$/ } @Fobtener todos los elementos de @Fla matriz que están hechos solo de dígitos y cuyo valor es<= 10
  • luego imprima líneas si grep regresa 0. Around significa ()que grepdevolverá 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 perlla 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
  • -vlíneas distintas al patrón coincidente
  • -wunir 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 nextregistro (línea) si es menor o igual a 10.

Respuesta3

esto es para sed

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

información relacionada