这是我的第一个问题,希望您能帮助我。我搜索过如何解决此问题,但尚未找到解决方案。
我有一个包含数千个重复内容的文本文件,如下所示:
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
我认为可以通过条件搜索来实现,该搜索打印以“查询”开头的第一行。但任何实现此目的的方法都很棒。
答案1
这个 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
), - 您要搜索的字符串不包含正则表达式特殊字符(如
.
或 )*
。如果是这样,可能需要使用其他函数。
答案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)
使用
- 将脚本复制到一个空文件中,另存为
quer.py
使用字符串(例如 F5)和文本文件作为参数运行它:
python3 /path/to/quer.py F5 /path/to/file.txt
如果路径包含空格,请使用引号括起来。
由于它按行读取,因此读取大型(巨大)文件时应该会非常快。
怎么运行的
- 它读遍每行,寻找一行,以
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
等等等等。