처음부터 여러 줄 모드까지 파일 내용 표시

처음부터 여러 줄 모드까지 파일 내용 표시

처음부터 여러 줄 모드까지 파일 내용을 표시하는 방법패턴 자체를 포함하지 않습니까?

예를 들어 다음과 같은 텍스트 파일이 있다고 가정해 보겠습니다.

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`

관련 정보