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

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

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 
  • Отображение файла в другом файле
  • Использование grep для поиска первых двух номеров IP-адресов?
  • sed для замены пробелов в кавычках
  • Как найти и заменить текст sed, содержащий звездочку *
  • Найти и заменить значения с помощью счетчиков
  • вернуть первый экземпляр символов из списка
  • Организация трехмерных данных с помощью awk / sed / perl
  • присоединиться к sed output
  • Как вставить первую строку одного файла в первую строку другого?
  • Как объединить файлы CSV
  • Как следить и искать в файле, проходящем через фильтр, менее
  • Interesting Posts

    Анализ паролей Apache для исключения диапазонов IP-адресов

    Может ли `make` автоматически устанавливать зависимости?

    В чем разница между ключом сообщения и дескриптором сообщения при передаче сообщений в System V IPC?

    ACPI пробуждение с клавиатуры / мыши через / proc / acpi / wakeup после приостановки. Как найти правильное устройство?

    Управление (динамические) файлы зон DNS с помощью кукольного (разрешенного)

    Как обновить раздел восстановления Fedora?

    настроить mysql с помощью django

    включение smtp на порту 465 и imap на порт 993 для webapps, работающего на centos 7

    Установленный coreutils на CentOS для sort -human-readable флага, но он все еще не работает

    См. Последовательный порт в качестве устройства MIDI IN

    Показать весь файл до матча

    изменить местоположение $ HOME / .Xauthority

    Как монтировать / конвертировать исходное изображение CD-ROM (.img)

    Как скрыть конкретный ip в Linux?

    Разделение и переименование файла

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