처음부터 여러 줄 모드까지 파일 내용을 표시하는 방법패턴 자체를 포함하지 않습니까?
예를 들어 다음과 같은 텍스트 파일이 있다고 가정해 보겠습니다.
cat
dog
fox
cow
dove
bird
bunny
gnu
hen
dove
bird
buffalo
내 스키마가 다음과 같은 경우:
dove
bird
bunny
내가 얻고 싶은 것은 :
cat
dog
fox
cow
내 실제 파일은 상당히 크기 때문에 이를 달성할 수 있는 방법이 여러 개 있는 경우 더 빠른 방법을 선호합니다.
그리고 방금 이것과 관련해 비슷한 질문을 드렸는데, 내용이 다르니, 그것 때문에 중복으로 표시하지 말아주세요!
답변1
다음을 사용하여 입력을 한 줄씩 처리 sed
하고 체인 다중 줄 패턴 일치를 처리할 수 있습니다.
/pat1/ { N; N; ...; /pat2\npat3\n.../q }
따라서 귀하의 예에서는 다음과 같습니다.
sed -n '/^dove$/ { N; N; /\nbird\nbunny$/q; }; p' infile
산출:
cat
dog
fox
cow
답변2
다음은 sed
분기를 사용하여 패턴 공간에서 3줄 버퍼를 유지하고 여러 줄 패턴에 대해 테스트한 후 발견되면 종료하는 또 다른 접근 방식입니다.
sed -n '
:a
$q
N
/dove\nbird\nbunny/q
3,$ {
P
D
}
ba
' file
GNU sed를 사용하면 Q
명령을 사용하여 현재 패턴 공간을 인쇄하지 않고 종료할 수 있으며 보다 자유로운 형식의 구문이 허용됩니다.
sed -e :a -e '$Q' -e 'N;/dove\nbird\nbunny/Q' -e '3,${P;D}' -e 'ba' file
또는
sed ':a; $Q; N; /dove\nbird\nbunny/Q; 3,${P;D}; ba' file
답변3
이를 수행하기 위한 몇 가지 Python 해킹이 있습니다.
암호:
# !/usr/bin/python
import sys
with open(sys.argv[2], 'rU') as f:
patterns = f.readlines()
result = None
with open(sys.argv[3], 'rU') as f:
last_match = 0
for i, line in enumerate(f):
if line != patterns[last_match]:
last_match = 0
else:
last_match += 1
if last_match == len(patterns):
result = i + 1 - len(patterns)
break
if result != None:
if sys.argv[1] == 'tail':
print("tail -n+%d %s" % (result+1, sys.argv[3]))
else:
print("head -n%d %s" % (result, sys.argv[3]))
달리다
가장 많은 패턴을 출력하려면:
`python split_on_pattern.py head pattern_file data_file`
패턴에서 출력하려면:
`python split_on_pattern.py tail pattern_file data_file`