次のファイル構造を想像してみてください。
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
印刷するプログラム/スクリプトを確実に作成できます。しかし、私の考えには1つあたりはあると思います。relevant=yes
foo.bar
これ以外にも標準のUnixユーティリティ(grep / sed / awk)を使用するボックス方式ですか?
どんなヒントでもありがとう!
答え1
入力が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
。 Eはx
パターンスペースの変更でスペースを維持し(行が一致する場合にのみ発生し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