Погрешность для 2 столбца, но в первом столбце могут быть пробелы - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть список ...

Group Chl# Code Name TMS ID Entitled
SPP Basic 1 VOD Charter On Demand 32046 true
Stream 2 KTVI KTVI 10750 true
Stream 4 KMOV KMOV 10575 true
Stream 5 KSDK KSDK 10685 true
Stream 6 SLATE VideoSlate 0 true
Stream 7 ION WRBU 11530 true
Stream 9 KETC KETC 10443 true
Stream 13 DAYSTAR WPXS Daystar Television 11337 true
Stream 14 SLATE VideoSlate 0 true
Tier 2 15 NFL NFL Network 34710 true
Stream 16 CSPAN CSPAN (Cable Satellite Public Affairs Network) 10161 true
Stream 17 UNI Univision Network (East) 11118 false
Tier 1 18 SECN SEC Network 89535 true
...
Select 104 HILLSNG The Hillsong Channel 29328 true
SPP Tier 1 106 BYUTV BYU - TV 21855 true
Tier 1 107 COWBOY The Cowboy Channel 10188 true
...
Tier 1 121 TNCK Nick - TeenNick 59036 true
SPP Tier 2 122 CI Crime and Investigation Network 48543 true
Tier 2 123 SMITH Smithsonian Channel 65799 true
...
Stream Sports, News & More 806 NBCSNHD NBC Sports Network HDTV 48639 true
SPP Tier 1 807 OLYHD Olympic Channel HDTV 104089 true
Select 809 GLFHD Golf Channel HDTV 61854 true
Tier 2 810 TNNSHD Tennis Channel HDTV 60316 true
Stream Sports, News & More 811 FS1HD Fox Sports 1 HD 82547 true

Если я получаю grep для числа, оно должно совпадать в столбце Chl#.

Например, если я grep 121 в этих данных, он должен вернуть

Tier 1 121 TNCK Nick - TeenNick 59036 true

Если я grep 122, он должен вернуть

SPP Tier 2 122 CI Crime and Investigation Network 48543 true

Версия:

$ grep -V
GNU grep 2.6.3

Этот grep, похоже, не распознает REGEX, как это:

(?=x)d

, что означает совпадение d, только если ему предшествует x, но не включает x.

Когда я получаю совпадение, меня интересует последнее поле, true или false.

Я легко могу получить это с помощью awk: {print $NF}. Использование grep не является обязательным требованием. Я бы предпочел использовать sed, grep и / или awk. Но не perl.

Первый столбец может содержать 0, 1 или более пробелов. Может иметь номер, запятую.

Второй столбец представляет собой число от 1 до 4 цифр.

Третий столбец - это одно слово.

Четвертый столбец может содержать несколько пробелов.

Пятым является число с 1 или более цифрами.

А шестое - «истинно» или «ложно».

Я играл с этим несколько часов. Любые предложения будут оценены.

1 Ответ

0 голосов
/ 18 сентября 2018

Я думаю, что следующее регулярное выражение описывает ваши данные:

^.* \d{1,4} \w+ .* \d+ (?:true|false)$

Число, которое вы хотите найти, заменяет \d{1,4} в регулярном выражении.Вы можете использовать опцию -P для GNU grep, чтобы получить PCRE.К сожалению, вы не можете использовать вид сзади для этого, потому что взгляды должны быть фиксированной длины, они не могут содержать .*.Таким образом, вы можете использовать это, чтобы соответствовать всей строке, а затем использовать что-то еще для извлечения последнего столбца.

grep -P '^.*? 121 \w+ .* \d+ (?:true|false)$' filename | awk '{print $NF}`

Ложные срабатывания все еще возможны, поскольку первый и четвертый столбцы могут содержать любое числослова.Если есть какие-то ограничения, которые вы можете указать для некоторых других столбцов (особенно для столбца 3), они могут сделать его лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...