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