<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
.