%20%D0%BF%D0%BE%D1%80%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F.png)
Мой файл выглядит так:
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