Это мой первый вопрос, и я надеюсь, что вы мне поможете. Я ищу, как это сделать, но не нашел решения.
У меня есть текстовый файл с тысячами повторений, подобный этому:
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». Но любой способ сделать это было бы замечательно.
В маленьком 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)
quer.py
выполните его со строкой (например, F5) и текстовый файл как аргументы:
python3 /path/to/quer.py F5 /path/to/file.txt
Если путь содержит пробелы, используйте кавычки вокруг этого.
Так как это читает на строку, это должно быть довольно быстро на больших (огромных) файлах.
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
и т.д., и т.д.
Эта команда 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
Я предполагаю что:
\n\n
как разделитель записей), Query=
, так, чтобы строка, которую Вы хотите распечатать, была вторым полем ($2
),.
или *
. Если так, другую функцию, возможно, придется использовать.