다른 줄을 기반으로 파일에서 줄 검색

다른 줄을 기반으로 파일에서 줄 검색

다음 파일 구조를 상상해 보세요.

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하고 인쇄하는 프로그램/스크립트를 확실히 작성할 수 있습니다 . 하지만 내 생각엔 하나쯤은 있을 것 같아relevant=yesfoo.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. E는 x패턴 공간 변경으로 공간을 유지하고(행이 일치하는 경우에만 발생 relevant=yes) d일치하지 않으면 삭제합니다 foobar.

답변3

파이썬적인 방식:

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

관련 정보