Совпадение только с самым первым появлением петтерна с использованием awk - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь следовать решению на

Перемещение совпадающих строк в текстовом файле с использованием sed

Ситуация такова, что pattern2 нужно применять только один раз во всем файле. Как я могу изменить следующее, чтобы сделать это

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ {t[2]=$0;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file

Вот файл, к которому я применил pattern2 (RELOC_DIR)

asdasd0
-SRC_OUT_DIR = /a/b/c/d/e/f/g/h
RELOC_DIR = /i/j/k/l/m
asdasd3
asdasd4
DEFAULTS {
asdasd6
$(RELOC_DIR)/some other text1
$(RELOC_DIR)/some other text2
$(RELOC_DIR)/some other text3
$(RELOC_DIR)/some other text4

и последние 4 строки файла были удалены из-за совпадения.

asdasd0
-SRC_OUT_DIR = /a/b/c/d/e/f/g/h
asdasd3
asdasd4
DEFAULTS {
RELOC_DIR = /i/j/k/l/m
asdasd6

1 Ответ

2 голосов
/ 14 марта 2019

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

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ && /check_other_text_in_current_line/{t[2]=$0;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file

Выше проверяется, check_other_text_in_current_line строка (которая является образцом, и вы можете изменить ее в соответствии с фактической строкой) присутствует вместе с pattern2 также в той же строке. Если это не то, что вы ищете, пожалуйста, опубликуйте примеры входных и ожидаемых результатов в вашем сообщении.



ИЛИ, если вы ищете, что только 1-й совпадет с pattern2 во Input_file и пропустите все остальные, попробуйте. Он напечатает только самое первое совпадение для pattern2 и пропустит все остальные (поскольку образцы не предоставляются OP, поэтому этот код написан только для запроса конкретного сопоставления с образцом)

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ && ++count==1{t[2]=$0;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file

OR

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ && !found2{t[2]=$0;found2=1;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file


РЕДАКТИРОВАТЬ: Хотя мое второе решение выглядит так, как должно быть в соответствии с запросом OP, но полная картина требования не приводится, поэтому добавление кода только для печати Pattern2 (строка * 1027) *) Первый случай здесь.

awk '/RELOC_DIR/ && ++ count==1{print}'  Input_file
RELOC_DIR = /i/j/k/l/m

OR

awk '!found2 && /RELOC_DIR/ { t[2]=$0; found2=1; print}' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...