Совпадение только с самым первым появлением pettern с помощью awk

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

Перемещение совпадающих строк в текстовом файле с помощью 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

Если есть несколько экземпляров pattern2, какой из них следует переместить?

jhnc 14.03.2019 03:48

@jhnc только первое появление. Другие должны быть проигнорированы

tulamba 14.03.2019 03:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
903
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что вам нужно проверить 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 14.03.2019 04:10

@jhnc, конечно, теперь добавил это в мои решения. Честно говоря, я добавил этот стиль подсчета, поскольку для OP/пользователей может быть легко понять, что условие будет истинным, когда его количество совпадений равно 1. Спасибо за помощь в его улучшении.

RavinderSingh13 14.03.2019 04:13

@ RavinderSingh13, пожалуйста, дайте мне знать, как я могу дать вам полную картину

tulamba 14.03.2019 14:09

@tulamba, ИМХО, открой новую тему. Затем упомяните 3 простых вещи: 1-й образец ввода, 2- образец вывода и 3-й- ваши усилия, которые вы приложили для решения вашей проблемы. Также будьте ясны в логике (ах), которые могут быть не на стороне программирования, а на стороне ожидаемого результата (как мы можем достичь ожидаемого результата (показано вами) и т. д.). Как только вы сделаете это со всей / полной информацией, я почти уверен, что вы получите полное руководство по своему вопросу (которое вы тоже получаете сейчас :)), приветствуйте и продолжайте наслаждаться этим замечательным сайтом ТАК.

RavinderSingh13 14.03.2019 14:12

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