Извлечение строк из файла в зависимости от других строк

Представьте следующую структуру файлов:

foo.bar.1 blabla moreblabla relevant=yes foo.bar.2 relevant=no foo.bar.3 blablabla foo.bar.4 relevant=yes 

Я хочу получить все строки foo.bar где внутри блока, следующего за самим собой, и до следующего foo.bar есть строка, в которой указано relevant=yes .

Таким образом, выход должен быть:

 foo.bar.1 foo.bar.4 

Я мог бы, конечно, написать программу / скрипт, итерацию по строкам, вспомнив foo.bars и напечатав их, когда есть строка, в которой foo.bars relevant=yes следуя за ними перед следующим foo.bar . Но я думал, что может быть из-за коробки с использованием стандартных утилит Unix (grep / sed / awk)?

Thanx для любых намеков!

3 Solutions collect form web for “Извлечение строк из файла в зависимости от других строк”

Если ввод обрабатывается по очереди, обработка должна проходить следующим образом:

  • если текущая строка – foo.bar , сохраните ее, запустив предыдущую строку foo.bar которая не была включена для вывода;
  • если текущая строка relevant=yes , это позволяет использовать последнюю foo.bar для вывода.

Подобные рассуждения – это работа для awk. (Это также можно сделать в sed, если вам нравится боль.)

 awk ' /^foo\.bar/ { foobar = $0 } /^relevant=yes$/ {if (foobar != "") {print foobar; foobar = ""}} ' 

Вот один из способов с sed :

 sed '/foo\.bar/h;/relevant=yes/!d;x;/foo\.bar/!d' infile 

Линии, сопоставляющие foobar , копируются в h старое пространство. Все строки, кроме тех, которые соответствуют relevant=yes , делятся. E x изменить пространство удержания с пространством шаблонов (это происходит только тогда, когда строки соответствуют relevant=yes ) и d elete, если он не соответствует foobar .

Питонический путь:

 >>> with open("/home/xieerqi/textfile.txt") as file: ... for line in file: ... if line.__contains__("foo"): ... VAR = line ... if line.__contains__("relevant=yes"): ... print VAR ... foo.bar.1 foo.bar.4 

Составленные в сценарии:

 DIR:/xieerqi skolodya@ubuntu:$ chmod +x relevance.py DIR:/xieerqi skolodya@ubuntu:$ ./relevance.py textfile.txt foo.bar.1 foo.bar.4 DIR:/xieerqi skolodya@ubuntu:$ cat relevance.py #!/usr/bin/env python import sys with open(sys.argv[1]) as file: for line in file: if line.__contains__("foo"): VAR = line.strip("\n") if line.__contains__("relevant=yes"): print VAR 
  • Как удалить все теги HTML с помощью sed?
  • Удалить строку, содержащую определенную строку, и следующую строку
  • Многострочное Regexp (grep, sed, awk, perl)
  • sed - печатать строки, соответствующие диапазону шаблонов, если одна строка соответствует условию
  • Расширение путей в переменных Bash в выражения sed
  • Как удалить первую точку перед первым номером?
  • Как заменить значение для данного условия в определенном столбце файла
  • Разбить заголовок в файле и на основе заголовка заменить значение в файле
  • Как я могу напечатать вторую в последнюю строку множество файлов в один файл?
  • с sed, как я могу заменить слово в соответствующей строке?
  • Как удалить строки короче XY?
  • Interesting Posts

    Как изменить порт связи между постфиксными и другими серверами?

    Как безопасно удалить системный раздел?

    Есть ли команда BASH для копирования всех файлов из дерева каталогов и размещения всех файлов в одном каталоге?

    Могу ли я использовать разрешения удаленного сервера через ssh?

    hda-codec и hda-intel

    Как исправить Debian, который отказывается подключиться к Интернету в VirtualBox?

    Как я могу читать и извлекать информацию из ленты DDS-1 сегодня?

    Почему «grep -q» потребляет весь входной файл?

    Неизвестный файл PHP, загруженный на сервер EEC4D8E4439299046B8CDB3F782

    Дрейф часов в гостевой системе VirtualBox

    Есть ли что-то важное в / var?

    Не удается SSH на любой сервер

    откройте несколько каталогов из терминала в виде вкладок в окне одного файлового менеджера

    Параметры командной строки с аргументом в сценарии оболочки

    Набор правил iptables заставляет сервер прекратить отвечать

    Linux и Unix - лучшая ОС в мире.