Как напечатать строку, которая сопровождается определенной строкой в ​​повторяющемся файле?

Это мой первый вопрос, и я надеюсь, что вы мне поможете. Я ищу, как это сделать, но не нашел решения.

У меня есть текстовый файл с тысячами повторений, подобный этому:

Query= AX-1  
[some lines without pattern]                                                             
A1
B2
C3
R7                                        

Query= AX-2 
[some lines without pattern]                                                                                                     
A1
F5  

Query= AX-3
[some lines without pattern]                                                                                                      
S9
T4
F5

Мне нужно напечатать все запросы, содержащие определенную строку. Например, если я ищу F5 , я должен получить:

AX-2
AX-3

и ищу A1 должен вывести:

AX-1
AX-2

I думаю, что это можно сделать с помощью условного поиска, который выводит первую предыдущую строку, начинающуюся с «Query». Но любой способ сделать это было бы замечательно.

2
задан 31 May 2016 в 19:56

2 ответа

В маленьком python сценарий:

#!/usr/bin/env python3
import sys
s = sys.argv[1]; f = sys.argv[2]

currqu = ""
with open(f) as src:
    for l in src:
        if l.startswith("Query"):
            currqu = l.split()[-1].strip()
        if l.strip() == s:
            print(currqu)

Использовать

  1. Скопируйте сценарий в пустой файл, сохраните его как quer.py
  2. выполните его со строкой (например, F5) и текстовый файл как аргументы:

    python3 /path/to/quer.py F5 /path/to/file.txt
    

Если путь содержит пробелы, используйте кавычки вокруг этого.
Так как это читает на строку, это должно быть довольно быстро на больших (огромных) файлах.

Как это работает

  • это прочитывает строки, ища строку, начиная с Query
  • если так, это сохраняет значение в строке "в памяти" до следующего возникновения "Query"
  • промежуточный это ищет Вашу разыскиваемую строку, печатает значение "Query", если это происходит, эффективно смотря "назад" раз так.

Править

Согласно просьбе в комментарии, версия, которая ищет

  • несколько соответствий в одной команде.

и сценарий

  • устраняет дубликаты.

Это создает вывод как:

$ '/home/jacob/Bureaublad/pscript_3.py' '/home/jacob/Bureaublad/look.txt' A1 F5
[A1]
AX-1
AX-2
[F5]
AX-2
AX-3

Сценарий

#!/usr/bin/env python3
import sys
strs = sys.argv[2:]; f = sys.argv[1]

for s in strs:
    print("["+s+"]")
    output = []; currqu = ""
    with open(f) as src:
        for l in src:
            if l.startswith("Query"):
                currqu = l.split()[-1].strip()
            if l.strip() == s:
                output.append(currqu)
        for item in sorted(set(output)):
            print(item)

Как использовать

Почти то же как первый сценарий, но теперь, запускается с файла как аргумент, затем строки. В принципе у Вас может быть столько строк, сколько Вам нравится в одной команде.

python3 /path/to/quer.py /path/to/file.txt F5 A1 B6 C7

и т.д., и т.д.

0
ответ дан 2 December 2019 в 04:56

Эта команда awk могла сделать задание:

awk -v RS='\n\n' -v target=<string> '$0 ~ target {print $2}'

Например:

$ awk -v RS='\n\n' -v target=F5 '$0 ~ target {print $2}' foo.txt 
AX-2
AX-3
$ awk -v RS='\n\n' -v target=A1 '$0 ~ target {print $2}' foo.txt
AX-1
AX-2

Я предполагаю что:

  1. разделы Запроса все разделяются пустыми строками (следовательно, две новых строки \n\n как разделитель записей),
  2. существует пространство после Query=, так, чтобы строка, которую Вы хотите распечатать, была вторым полем ($2),
  3. строка, которую Вы хотите искать, не имеет regex специальных символов как . или *. Если так, другую функцию, возможно, придется использовать.
1
ответ дан 2 December 2019 в 04:56

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

Похожие вопросы: