Вернуть только часть строки после соответствующего шаблона - PullRequest
0 голосов
/ 25 апреля 2019

Мне нужна помощь для работы с командой, где файл с разделителем * (звездочкой) имеет несколько строк, как указано ниже.Я хочу найти строку, которая начинается с NM1*IL и извлечь последний столбец.Ниже приведен пример.

$ cat temp.txt
NM1*IL*1*RESTAR*FRENNY*M***MI*99358358~
N3*2164 Boeing Avenue~
N4*NEW DELHI*CA*94114~
DMG*D0*19550610*F~
NM1*PR*2*KFHP*****PI*94135~
NM1*IL*1*STAR*FRENY*M***MI*99358958~
NM1*IL*1*RESTA*ANNIE*M***MI*993583589~

Я хочу вывод, как показано ниже

99358358
99358958
993583589

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Поскольку ваш вопрос помечен linux, я предполагаю, что вы используете GNU grep:

$ grep -oP '^NM1\*IL.*\*\K.*(?=~)' /tmp/file
99358358
99358958
993583589

Используется синтаксис pcre с утверждениями нулевой ширины с предварительным просмотром и предварительным просмотром - материал, соответствующий до \K и внутри (?=...), не будет включен в вывод, когда -o опция используется.

0 голосов
/ 25 апреля 2019

grep 'NM1[*]IL' temp.txt | awk -F'*' '{print $NF}' | sed 's/~$//'

Вы можете запустить части этого конвейера (вплоть до | и не включая), чтобы увидеть, что конкретные команды делают с вашим вводом.

grep 'NM1[*]IL' - отфильтруйте входные строки, чтобы остались только те, которые соответствуют этому шаблону.grep принимает регулярное выражение в качестве аргумента, а * - это специальный символ регулярного выражения (означающий 0 или более символов, за которым он следует), поэтому его необходимо экранировать.Я использовал класс символов здесь ([]), потому что я думаю, что это аккуратно.Мог бы использовать NM1\*IL для того же эффекта.

awk -F'*' - -F указывает разделитель полей , который я установил на *.Awk разбивает каждую входную строку на поля , поэтому все, что находится между двумя * s, является полем для awk.

'{print $NF}' - это программа awk, которую он теперь будет выполнять на своем входе.Он говорит: «для всех входных строк выведите поле с номером NF», где NF - специальная переменная awk, оно означает «количество полей».Так что он печатает последнее поле.

sed 's/~$//' - просто уберите конечный ~.$ означает конец строки.Так что этот sed заменяет любые тильды, предшествующие EOL, пустой строкой.Могли бы написать tr -d '~', но этот sed более точен (только тильды перед EOL).

grep(1), awk(1p) и sed(1) - все стандартные утилиты командной строки UNIX.Изучите справочные страницы для получения дополнительной информации о том, как их использовать.

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