Как использовать Awk для вывода нескольких последовательных строк

Ввод/Файл

A:1111
B:21222
C:33rf33
D:444dct4
E:5tdffe
F:4444we
G:j5555
H:46666
I:efe989ef
J:efee

В основном нужно выбрать строку, содержащую 2122 (т.е. строку B/2) & строка, начинающаяся с 444dct4 (т.е. строка D) до efe989ef (т.е. строка I/9) Обобщить

Select Line B (contains 2122)
Select Line D (444dct4) till Line I

Желаемый результат

B:21222
D:444dct4
E:5tdffe
F:4444we
G:j5555
H:46666
I:efe989ef

Добро пожаловать в SO, не могли бы вы добавить свои усилия в свой вопрос, который настоятельно рекомендуется в SO. Также, пожалуйста, объясните логику получения ожидаемого результата более четко в своем вопросе.

RavinderSingh13 22.12.2020 09:30

Я думаю, что этот вопрос дублирует stackoverflow.com/questions/12182910/…

Karim Tawfik 22.12.2020 09:31

Кроме того, вам нужна строка, содержащая 2122 ИЛИ (т.е. строка B ИЛИ 2)

James Brown 22.12.2020 09:33

Спасибо, Джеймс. Строка, содержащая 2122

Prasad V 22.12.2020 10:00

@KarimTawfik Я полагаю, что вопрос касается двух отдельных файлов, если я правильно понимаю. Мне нужен один файл и нужен желаемый результат

Prasad V 22.12.2020 10:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
5
117
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
awk -v str1 = "2122" -v str2 = "444dct4" -v str3 = "efe989ef" 'BEGIN { flag=0 } $0 ~ str1 { print } $0 ~ str2 { flag=1 } $0 ~ str3 { flag=0;print;next } flag' file

Для гибкости задайте строку для поиска как str1, строку from как str2 и строку to как str3. Установите флаг печати (флаг) для начала. Когда 2122 находится во втором поле, напечатайте. Затем, когда второе поле начинается с 44dct4, установите флаг печати на единицу. Когда второе поле начинается с efe989ef, установите флаг печати на 0, напечатайте строку и перейдите к следующей записи. Затем флаг переменной будет определять, что печатается, а что нет.

спасибо Раман. Я не мог заставить это работать. не могли бы вы поделиться командой, которая работает для вас

Prasad V 22.12.2020 12:30

Та же команда, что и выше. Я использовал образец примера, который вы разместили. Я также проверил, что вывод соответствует требованиям.

Raman Sailopal 22.12.2020 12:32
$ awk -F: '
/2122/ {                      # line that contains 2122
    print                  
    next                      # to avoid duplicate printing if 2122 also in D-I
}
$2~/^444dct4/,$2~/efe989ef/   # starts with 444dct4 till efe989ef
' file

Выход:

B:21222
D:444dct4
E:5tdffe
F:4444we
G:j5555
H:46666
I:efe989ef

Редактировать:

Один лайнер:

$ awk -F: '/2122/{print; next} $2~/^444dct4/,$2~/efe989ef/' file.txt 

awk -F: '/2122/ { printnext } $2~ /^444dct4/,$2~ /efe989ef/' файл.txt

Prasad V 22.12.2020 12:09

Вывод начинается с D и заканчивается до I. Не вижу B в выводе

Prasad V 22.12.2020 12:09
/2122/ { printnext } нужен ; между ними: /2122/ {print; next}
James Brown 22.12.2020 15:05

Не могли бы вы попробовать выполнить, написать и протестировать показанные образцы в GNU awk. Это также заботится о том, чтобы 2-й столбец строки 21222 находился между диапазоном от 444dct4 до efe989ef, тогда он НЕ будет перепечатывать его.

awk -F':' '
$2= = "21222" && !found{
  print
  next
}
$2= = "444dct4"{
  found=1
}
found
$2= = "efe989ef"{
  found = ""
}
'  Input_file

Объяснение: Добавлено подробное объяснение вышеизложенного.

awk -F':' '              ##Starting awk program from here and setting field separator as colon here.
$2= = "21222" && !found{   ##Checking if 2nd field is 21222 and found is NOT set then try following.
  print                  ##Printing the current line here.
  next                   ##next will skip all further statements from here.
}
$2= = "444dct4"{           ##Checking condition if 2nd field is 444dct4 then do following.
  found=1                ##Setting found to 1 here.
}
found                    ##Checking condition if found is SET then print that line.
$2= = "efe989ef"{          ##Checking condition if 2nd field is efe989ef then do following.
  found = ""               ##Nullifying found here.
}
'  Input_file            ##Mentioning Input_file name here.

Спасибо. я пробовал, но нет выхода. не могли бы вы поделиться командой, которая работает для вас

Prasad V 22.12.2020 12:30

@PrasadV, это проверенное решение, и оно отлично сработало для меня с показанными вами образцами. Ваш фактический Input_file такой же, как показанные образцы?

RavinderSingh13 22.12.2020 12:31

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