Я пытаюсь следовать решению на
Перемещение совпадающих строк в текстовом файле с помощью 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
Вот файл, к которому я применил шаблон2 (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
@jhnc только первое появление. Другие должны быть проигнорированы





Я предполагаю, что вам нужно проверить 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 и пропускаете все остальные, попробуйте. Он будет печатать только самое первое совпадение для шаблона2 и пропускать все остальные (поскольку образцы не предоставляются 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
ИЛИ
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 (строка RELOC_DIR) здесь.
awk '/RELOC_DIR/ && ++ count==1{print}' Input_file
RELOC_DIR = /i/j/k/l/m
ИЛИ
awk '!found2 && /RELOC_DIR/ { t[2]=$0; found2=1; print}' Input_file
В общем, вероятно, немного эффективнее сначала проверить количество, чтобы вам не приходилось выполнять избыточные совпадения с регулярными выражениями: !found2 && /pattern2/ { t[2]=$0; found2=1; next; }
@jhnc, конечно, теперь добавил это в мои решения. Честно говоря, я добавил этот стиль подсчета, поскольку для OP/пользователей может быть легко понять, что условие будет истинным, когда его количество совпадений равно 1. Спасибо за помощь в его улучшении.
@ RavinderSingh13, пожалуйста, дайте мне знать, как я могу дать вам полную картину
@tulamba, ИМХО, открой новую тему. Затем упомяните 3 простых вещи: 1-й образец ввода, 2- образец вывода и 3-й- ваши усилия, которые вы приложили для решения вашей проблемы. Также будьте ясны в логике (ах), которые могут быть не на стороне программирования, а на стороне ожидаемого результата (как мы можем достичь ожидаемого результата (показано вами) и т. д.). Как только вы сделаете это со всей / полной информацией, я почти уверен, что вы получите полное руководство по своему вопросу (которое вы тоже получаете сейчас :)), приветствуйте и продолжайте наслаждаться этим замечательным сайтом ТАК.
Если есть несколько экземпляров pattern2, какой из них следует переместить?