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