Удалить строки со значением ниже (или выше) порогового значения

Удалить строки со значением ниже (или выше) порогового значения

Мой файл выглядит так:

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

Я хотел бы удалить строки, содержащие значение =< 10 в любом из столбцов. Я знаю об использовании sedи, awk '$3 !=< 10'но это удалит только строки в третьем поле. Есть ли способ указать qwk учитывать все столбцы?

решение1

perlв помощь

$ 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разделить входную строку на пробел и сохранить в @Fмассив
  • grep { $_ <= 10 && /^\d+$/ } @Fполучить все элементы @Fмассива, которые состоят только из цифр и значение которых равно<= 10
  • затем вывести строки, если grep возвращает 0. ()Круг grepозначает, что он вернет количество совпадений, а не сами элементы

Давайте проверим еще одно условие:

$ 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


Определенные условия, как в этом вопросе, можно решить с помощью grep(что, вероятно, быстрее, чем perlрешение)

$ 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линии, отличные от соответствующих шаблону
  • -wсоответствовать только целым словам

решение2

В awk, вы можете использовать что-то вроде for (i = 1 ; i <= NF ; i++) { ... }для перебора всех полей в строке. С этим, что-то вроде:

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

$i ~ /^[0-9]+$/проверяет, содержит ли поле только цифры, а затем сравнивает с 10, переходя к nextзаписи (строке), если значение меньше или равно 10.

решение3

это для sed

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

Связанный контент