awk: 패턴을 따르는 N 행 뒤에 행 삽입

awk: 패턴을 따르는 N 행 뒤에 행 삽입

패턴 뒤 세 번째 행에 행을 삽입하고 싶습니다. 예: z각 일치 항목 뒤에 단어 3줄을 삽입합니다.a

~에서

a 
b1
c1
d1


a 
b2
c2
d2

...

도착하다

a 
b1
c1
z
d1


a 
b2
c2
z
d2

...

답변1

$ awk '/a/{c=1} (c++)==4{print "z"} 1' file
a
b1
c1
z
d1


a
b2
c2
z
d2

답변2

또는sed 삽입/추가:

sed '/^a/{n;n;n;i\z
}' FILE
sed '/^a/{n;n;a\z
}' FILE

답변3

다음과 같은 작업이 수행됩니다.

awk 'BEGIN {v1=-100} {if ($1=="a") v1=FNR;if (FNR-v1==3) print "z"; print $0}' input_file

스크립트는 레코드가 "a"인지 확인하고 현재 행을 가리키도록 변수를 설정합니다. 그런 다음 현재 레코드 행에서 이전에 저장된 행을 뺀 값이 3인지 확인하고 문자열을 인쇄한 다음 현재 행을 인쇄합니다.

답변4

ed이를 수행하려면 스크립트 가능한 편집기를 사용할 수 있습니다 . z일치 항목 뒤에 전체적으로 세 줄을 삽입하십시오 /a/.

$ ed -s input-file
g/a/+3i\
z
wq

또는 한 줄로:

printf '%s\n' 'g/a/+3i\' 'z' 'wq' | ed -s input-file

명령은 다음 ed과 같습니다:

  • g/a/+3i\-- 후속 명령을 전체적으로 실행합니다. 즉, /a/ 뒤의 세 줄을 일치시키고 일부 텍스트를 삽입합니다. 후행 백슬래시는 삽입 명령을 다음 줄로 계속합니다.
  • z- 텍스트를 삽입합니다 z. 후행 백슬래시가 없기 때문에 insert 명령이 종료되고 전역 실행이 완료됩니다.
  • wq-- 파일을 다시 디스크에 쓰고 종료합니다.

관련 정보