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

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

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

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. 이거 실행하려고 하는데수세 리눅스

답변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. 예를 들어, 각 항목 앞에 5번째 줄을 인쇄하려면 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=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

따라서 더 큰 값의 경우에도 빠르게 번거로워집니다.질소스크립트 파일을 준비하여 에 전달할 수 있습니다 sed.

관련 정보