想象一下以下文件结构:
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