GREP -Как найти людей, выигравших более 50 гонок

Вы действительно написали '???hex'? если так, то именно поэтому это не сработало.

Однако наиболее логичным ответом будет то, что вы имеете в виду множество вариантов сопоставления, существующих в picocom. Ваша линия и так в порядке. Я думаю, что ваша версия picocom слишком старая, чтобы иметь доступ к этим функциям.

Например, у меня есть версия 1.7 на raspberry pi, и она также не работает с этими параметрами, однако использование версии 3.1, которая является последней на данный момент, работает нормально.

-2
28.12.2020, 02:59
3 ответа

Используйте awk, это вернет все записи, где 5-е поле, которое является выигрышным, больше 50 или не является числом.

awk '$5 > 50' f1.txt

Вот это

Rank Country         Driver                      Races Wins
1   [United_Kingdom] Lewis_Hamilton                264 94
2   [Germany] Sebastian_Vettel                     254 53
6   [Germany] Michael_Schumacher                   307 91
13  [France] Alain_Prost                           199 51
68  [Italy] Alberto_Ascari                         36  132

Поскольку в данном случае это последнее поле в строке, вы также можете использовать

awk '$NF > 50' f1.txt

Если вы действительно хотите использовать grep, вы можете использовать что-то вроде этого из ответа, сделанного Грегом Фентоном, но вам нужно изменить -Eна -P, чтобы использовать регулярное выражение Perl, добавить \b, чтобы указать, что цифра следует за границей слова, поэтому перед ней нет цифр или букв, и измените первый \dв трехзначной части на [1-9], чтобы не было трехзначных чисел с ведущим 0

grep -P '\b([5-9][1-9]|60|[1-9]\d\d)$' f1.txt

Это означает, что есть только двух- или трехзначные выигрыши.

\b означает границу слова, это означает, что перед первой цифрой не должно быть ни цифр, ни букв
()означает, что после границы слова вам нужно указать то, что определено внутри скобок.
[5 -9][1 -9] означает, что должно быть две цифры, где первая цифра 5 -9, а вторая 1 -9, что означает, что он поймает номера 51 -99 за исключением 60.
| означает или оператор, и поскольку 60 исключено в предыдущем регулярном выражении [5-9][1-9], мы говорим или 60.
|[1 -9]\d\d означает или три цифры, где первая цифра 1 -9, за которой следуют любые две цифры, [1-9]\d\dтакже может быть [1-9][0-9][0-9]
$ означает конец строки, после последней цифры должен быть конец строки, чтобы вы не ловили числа, которые не находятся в последнем поле, за которыми не следует конец строки.

Таким образом, в основном grep говорит искать границу слова, за которой следует двух- или трехзначное число больше 50, за которым следует конец строки.


Эта часть [5-9][1-9]|60находит двузначные числа 51 -99, а эта часть [1-9]\d\dнаходит трехзначные числа, где первая цифра равна 1 -9, если вы хотите использовать более трех цифр, добавьте еще одну или работа с |как

grep -P '\b([5-9][1-9]|60|[1-9]\d\d|[1-9]\d\d\d)$' f1.txt

Вышеприведенное относится к четырем цифрам.

Если вы хотите использовать любое количество цифр, используйте что-то вроде этого

grep -P '\b([5-9][1-9]|60|[1-9]\d\d)\d*$' f1.txt

Если по какой-то причине регулярное выражение Perl не работает в вашем grep, вы можете попробовать расширенное регулярное выражение

grep -E '\b([5-9][1-9]|60|[1-9][0-9][0-9])[0-9]*$' f1.txt
4
18.03.2021, 22:40

для grep(, если вам это действительно нужно awk), то есть:

grep -E '[[:blank:]]0*(5[1-9]|[6-9][0-9]|[1-9][0-9][0-9])[0-9]*$' infile
0
18.03.2021, 22:40

Придерживаясь необходимости использовать grep, как насчет:

grep -E '([5-9]\d|\d\d\d)$' f1.txt

, что дает:

$ grep -E '([5-9]\d|\d\d\d)$' f1.txt
1   [United_Kingdom] Lewis_Hamilton                264 94
2   [Germany] Sebastian_Vettel                     254 53
6   [Germany] Michael_Schumacher                   307 91
13  [France] Alain_Prost                           199 51
68  [Italy] Alberto_Ascari                         36  132
0
18.03.2021, 22:40

Теги

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