根据其他行从文件中检索行

根据其他行从文件中检索行

想象一下以下文件结构:

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并在有一行relevant=yes在下一行之前打印它们foo.bar。但我想可能有一个之外的使用标准 Unix 实用程序(grep/sed/awk)的盒式方式?

感谢您的任何提示!

答案1

如果输入是逐行处理的,那么处理需要这样进行:

  • 如果当前行是foo.bar,则存储它,忘记任何foo.bar未启用输出的前一行;
  • 如果当前行是relevant=yes,则启用最新的foo.bar输出。

这种推理是 awk 的工作。 (如果你喜欢痛苦,也可以在 sed 中完成。)

awk '
    /^foo\.bar/ { foobar = $0 }
    /^relevant=yes$/ {if (foobar != "") {print foobar; foobar = ""}}
'

答案2

这里有一种方法sed

sed '/foo\.bar/h;/relevant=yes/!d;x;/foo\.bar/!d' infile

匹配的行foobar被复制到h旧空间。除匹配的行外,所有行relevant=yes均被d删除。 Ex用模式空间更改保持空间(这仅在行匹配时发生relevant=yes),d如果不匹配则删除foobar

答案3

Python式的方式:

>>> 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

相关内容