일치하는 줄에서 일치하는 줄과 n 번째 줄을 인쇄하십시오.


18

일치하는 줄 (검색중인 표현식이 들어있는 줄)에서 일치하는 줄과 네 번째 줄을 인쇄하려고합니다.

다음 코드를 사용하고 있습니다. sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt

그러나 이것은 일치하는 줄만 인쇄합니다.

네 번째 줄만 인쇄합니다. awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt

일치하는 줄과 네 번째 줄만 인쇄해야합니다.


사용 egrep "pattern" -A4
Valentin Bajrami

@ val0x00ff이 인쇄도 사이에 선 ..입니다 : 그것은 일치하는 라인부터 다음 4 개 라인 출력
debal

"내가 일치하는 줄과 일치하는 줄에서 네 번째 줄을 인쇄하려고합니다"라고 말합니다. grep -A 4 "pattern" file | sed -n '4p'내가 당신을 오해하지 않는 한 이것은 당신이 원하는 것을 정확하게합니다
Valentin Bajrami

아뇨. 위 코드의 결과는 </td>4 번째 줄이 아니 었습니다
debal

답변:


18

awk에서는 다음과 같이 할 것입니다.

awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`

또는

awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`

설명

첫 번째 솔루션은 일치하는 모든 줄을 찾습니다 pattern. 일치하는 것을 찾으면 레코드 번호 ( NR)를 배열에 저장합니다 nr. 또한 NR동일한 배열에 네 번째 레코드를 저장합니다 . 이것은에 의해 수행됩니다 nr[NR+4]. NR그런 다음 모든 레코드 ( )를 검사하여 nr배열에 레코드가 있는지 확인하여 레코드가 인쇄되는지 확인합니다.

두 번째 솔루션은 pattern해당 라인을 인쇄 한 다음 4 번째 레코드를 배열에 먼저 저장 nr한 후 다음 레코드로 이동하는 경우를 제외하고는 기본적으로 동일한 방식으로 작동 합니다 . 그런 다음 awk이 네 번째 레코드를 만나면 NR in nr블록이 실행되고이 +4 레코드를 인쇄합니다.

다음은 예제 데이터 파일 sample.txt입니다.

$ cat sample.txt 
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16

첫 번째 솔루션 사용 :

$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt 
4 blah
8
10 blah
14

두 번째 솔루션 사용 :

$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt 
4 blah
8
10 blah
14

3
좋아요, +1 awk여기에 많은 지름길을 사용하고 있습니다. 짧은 설명을 추가 할 수 있습니까?
terdon

@terdon에 동의하면 코드를 조금 설명해 주시겠습니까?
debal

@slm 완전한 답변을 개선하고 제공해 주셔서 감사합니다!
Valentin Bajrami

1
답변 주셔서 감사합니다, 나는 그것으로 뭔가 새로운 것을 배웠습니다.
slm

4
sed -n 's/^[ \t]*/; /img class=\"devil_icon/,+4 { 3,5d ; p }' input.txt

인쇄하기 전에 적절한 줄을 삭제하고 있습니다 { 3,5d ; p }.


: 당신의 표현은 오류 발생 sed: -e expression #1, char 18: unknown option to s'`
미네랄

4

일치하는 줄 이후 몇 줄을 인쇄할지 지정하는 -A옵션을 사용해보십시오 grep. 이것을와 결합 sed하면 필요한 줄을 얻을 수 있습니다.

grep -A 4 pattern input.txt | sed -e '2,4d'

를 사용 sed하여 두 번째 줄에서 네 번째 줄까지를 삭제합니다.


3
이것은 pattern파일에서 단일 일치를 가정 합니다.
terdon

2

다음은 Perl에서 임의의 수의 일치하는 줄을 처리 할 수있는 방법입니다.

perl -ne '/pattern/ && do{$c=$.; print}; $.==$c+4 && print' file > new_file`

펄에서. 특수 변수 $.는 현재 줄 번호입니다. 따라서 일치하는 줄을 찾을 때마다 pattern인쇄하고 줄 번호를로 저장합니다 $c. 그런 다음 현재 줄 번호가 이전에 인쇄 된 줄 번호보다 4 더 많으면 다시 인쇄합니다.


0
awk 'c&&!--c;/img class=\"devil_icon/{c=4};/img class=\"devil_icon/' input.txt

본질적으로 찾기 및 바꾸기를 수행하고 있습니다. 같은 명령에 찾기 만 추가하면 둘 다 인쇄됩니다. :)

awk 'c&&!--c;/pattern/{c=4};/pattern/' input.txt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.