異なる行に基づいてファイルから行を検索する

異なる行に基づいてファイルから行を検索する

次のファイル構造を想像してみてください。

foo.bar.1
blabla
moreblabla
relevant=yes
foo.bar.2
relevant=no
foo.bar.3
blablabla
foo.bar.4
relevant=yes

私は自分に従い、次の行の前に行のドアがあるfoo.barブロック内のすべての行を検索したいと思います。foo.barrelevant=yes

したがって、出力は次のようになります。

foo.bar.1
foo.bar.4

行を繰り返し、次の行の前に行がある場合は、覚えてfoo.bars印刷するプログラム/スクリプトを確実に作成できます。しかし、私の考えには1つあたりはあると思います。relevant=yesfoo.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

関連情報