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

После некоторых исследований я обнаружил, что проблема была в том, что я все еще использовал режим Legacy BIOS. Я использовал этот HowTo для преобразования в uefi: http://social.technet.microsoft.com/wiki/contents/articles/14286.converting-windows-bios-installation-to-uefi.aspx

Затем я просто установил его снова.

4
22.09.2016, 18:34
3 ответа

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 , соответствуют только целым словам
7
27.01.2020, 20:46

В awk вы можете использовать что-то вроде для (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 , перемещаясь в следующая запись (строка), если она меньше или равна 10.

7
27.01.2020, 20:46

это для sed

sed -rn '/\b([0-9]|10)\b/!p' file
0
27.01.2020, 20:46

Теги

Похожие вопросы