패턴과 일치하는 각 줄 앞에 N번째 줄만 인쇄합니다.

패턴과 일치하는 각 줄 앞에 N번째 줄만 인쇄합니다.

<N>검색 패턴 앞의 번째 줄만 인쇄하려고 합니다 . 검색 패턴 앞의 grep -B<N>모든 행을 인쇄합니다 . <N>awk 코드를 봤어요여기<N>검색 패턴 다음의 번째 줄만 인쇄할 수 있습니다 .

awk 'c&&!--c;/pattern/{c=N}' file

<N>일치하는 각 줄 앞에 있는 번째 줄만 인쇄하도록 이를 수정하는 방법은 무엇입니까 pattern? 예를 들어, 여기 내 입력 파일이 있습니다

...
...
   0.50007496  0.42473932  0.01527831
   0.99997456  0.97033575  0.44364198
Direct configuration=     1
   0.16929051  0.16544726  0.16608723
   0.16984300  0.16855274  0.50171112
...
...
   0.50089841  0.42608090  0.01499159
   0.99982054  0.97154975  0.44403547
Direct configuration=     2
   0.16931296  0.16553376  0.16600890
   0.16999941  0.16847055  0.50170694  
...

2nd line검색 문자열 이전 을 다시 알려줄 수 있는 명령이 필요합니다 Direct configuration. 이걸 실행하려고 해요SUSE-Linux

답변1

라인 버퍼를 사용해야 합니다.

이것을 시도해 보십시오:

awk -v N=4 -v pattern="example.*pattern" '{i=(1+(i%N));if (buffer[i]&& $0 ~ pattern) print buffer[i]; buffer[i]=$0;}' file

N인쇄할 패턴 앞의 N번째 라인에 값을 설정합니다 .

pattern검색할 정규식에 값을 설정합니다 .

buffer요소 의 배열입니다 N. 라인을 저장하는 데 사용됩니다. 패턴을 찾을 때마다 N패턴 앞의 번째 줄이 인쇄됩니다.

답변2

해당 코드는 이전 줄에서는 작동하지 않습니다. 일치하는 패턴 이전의 줄을 얻으려면 이미 처리된 줄을 어떻게든 저장해야 합니다. 연관 배열만 있으므로 awk에서 원하는 작업을 수행하는 똑같이 간단한 방법을 생각할 수 없으므로 awk여기에 Perl 솔루션이 있습니다.

perl -ne 'push @lines,$_; print $lines[0] if /PAT/; shift(@lines) if $.>LIM;' file 

PAT일치시키려는 패턴과 LIM줄 수로 변경하십시오 . 예를 들어, 가 나타날 때마다 다섯 번째 줄을 인쇄하려면 foo다음을 실행합니다.

perl -ne 'push @lines,$_; print $lines[0] if /foo/; shift(@lines) if $.>5;' file 

설명

  • perl -ne: 입력 파일을 한 줄씩 읽고 -e각 줄에 주어진 스크립트를 적용합니다.
  • push @lines,$_: 현재 줄( $_)을 배열에 추가합니다 @lines.
  • print $lines[0] if /PAT/: 현재 줄이 원하는 패턴과 일치하면 배열의 첫 번째 요소 @lines( )를 인쇄합니다.$lines[0]
  • shift(@lines) if $.>LIM;: $.현재 줄 번호입니다. 이 값이 제한보다 크면 배열에서 첫 번째 값을 제거합니다 @lines. 결과적으로 @lines항상 마지막 LIM줄이 표시됩니다.

답변3

tac file | awk 'c&&!--c;/pattern/{c=N}' | tac

그러나 이는 서로 N 줄 내에 일치하는 항목이 여러 개 있을 때 '전달' 사용 사례와 동일한 생략이 있습니다.

입력이 실행 중인 프로세스에서 파이프될 때는 잘 작동하지 않지만 입력 파일이 완전하고 커지지 않을 때 가장 간단한 방법입니다.

답변4

.sed

을 위한N=1:

sed '$!N; /.*\n.*pattern/P; D' FILE

을 위한N=2

sed '1N; $!N; /.*\n.*\n.*pattern/P; D' FILE

에 대한N=2이 경우 첫 번째 줄은 다음 줄을 읽습니다.N-1패턴 공간의 라인은 N;P;D사이클을 시작합니다. 다른 라인을 읽고 패턴 공간의 마지막 라인이 일치하면 패턴 공간의 첫 번째 라인을 인쇄한 다음 삭제하고 새 사이클을 시작합니다.

단점은 다른 값에 맞게 수정해야 한다는 것입니다.N:

을 위한N=3:

sed '1{N;N}; $!N; /.*\n.*\n.*\n.*pattern/P; D' FILE

을 위한N=4:

sed '1{N;N;N}; $!N; /.*\n.*\n.*\n.*\n.*pattern/P; D' FILE

따라서 더 큰 값의 경우 빠르게 번거로워집니다.N스크립트 파일을 준비하여 sed.

관련 정보