awk: печатать только строки, которые следуют за определенным шаблоном линии защиты

Рассмотрим этот файл:

#!/usr/bin/env bash
cat > example_file.txt <<EOL
|dms,wew,qwqw|
|m|head1|
|3,4,6|
|3e,2,23|
|m|head2|
|xw,12,2123|
|23,d,213|
|23,22q,2skl|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|
EOL

Время от времени будет паттерн защиты: строка, начинающаяся с:

|m|

(да, первая строка файла не обязательно должен быть шаблоном защиты) Теперь я хочу напечатать только те строки, для которых был последний шаблон защиты:

|m|head1|

и игнорировать все остальные строки. В другом худшем случае я хотел бы, чтобы результат был:

#!/usr/bin/env bash
cat > desired_result_file.txt <<EOL
|m|head1|
|3,4,6|
|3e,2,23|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|
EOL
7
задан 22 September 2019 в 02:32

1 ответ

Regex-ориентированный

$ awk '/^\|m\|/ {/\|head1\|/ ? p=1 : p=0} p' example_file.txt 
|m|head1|
|3,4,6|
|3e,2,23|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|

или ориентированный на поле

$ awk -F'|' '$2 == "m" {$3 == "head1" ? p=1 : p=0} p' example_file.txt 
|m|head1|
|3,4,6|
|3e,2,23|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|

p эффективно флаг печати.

Программы Awk состоят из pattern {action} пары, в который action выполняется на записи если pattern оценивает верный (ненулевой). Можно опустить pattern - в этом случае {action} оценен для каждой записи - или опустить {action} в этом случае awk применяет шаблон по умолчанию, который должен распечатать запись: последний - то, что происходит здесь.

7
ответ дан 23 November 2019 в 06:36

Другие вопросы по тегам:

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