如何打印重复文件中后面跟着特定字符串的行?

如何打印重复文件中后面跟着特定字符串的行?

这是我的第一个问题,希望您能帮助我。我搜索过如何解决此问题,但尚未找到解决方案。

我有一个包含数千个重复内容的文本文件,如下所示:

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

我假设:

  1. 查询部分全部由空行分隔(因此,两个换行符\n\n作为记录分隔符),
  2. 后面有一个空格Query=,因此要打印的字符串是第二个字段($2),
  3. 您要搜索的字符串不包含正则表达式特殊字符(如.或 )*。如果是这样,可能需要使用其他函数。

答案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”的值,有效地如果是这样的话,请“向后”看。

编辑

根据评论中的要求,寻找一个版本

  • 多个匹配项在一个命令中。

和脚本

  • 消除重复

它创建如下输出:

$ '/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

等等等等。

相关内容