다음 파일 구조를 상상해 보세요.
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
. 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