요청이 있습니다. 내 파일 내용이 다음과 같다고 가정해 보겠습니다.
a
b
c
d
e
f
d
e
f
b
에서 두 번째까지 행을 반복적으로 인쇄하고 싶습니다 d
. 이 작업을 수행하는 awk 명령이 있습니까?
출력은
b
c
d
e
f
d
처음이라면 b
명령어는 알겠는데
awk '/b/,/d/' file.txt
하지만 두 번째로 반복되면 일치하는 지점에 텍스트를 인쇄하고 싶습니다. 명령을 한 줄로 작성하고 싶습니다.
답변1
한 가지 방법은 플래그와 카운터를 사용하여 추적하는 것입니다.
$ awk '/b/{f=1; c=0} f; /d/ && ++c==2{f=0}' file.txt
b
c
d
e
f
d
/b/{f=1; c=0}
시작 일치 플래그를 설정하고 카운터를 초기화합니다.f;
긴 플래그가 설정된 경우 입력 레코드 인쇄/d/ && ++c==2{f=0}
끝 문자열이 두 번째로 일치하면 플래그를 지웁니다.awk '/b/{f=1} f; /d/ && ++c==2{exit}'
추출할 세트가 하나만 있는 경우 단순화할 수 있습니다.
최종 일치 항목에 일치 항목이 2개 없으면 입력이 끝날 때까지 인쇄됩니다.
$ seq 10 | awk '/4/{f=1; c=0} f; /6/ && ++c==2{f=0}'
4
5
6
7
8
9
10
답변2
- 더 읽기 쉬운 코드. 문자 수를 추적하세요.
- b=1 및 d<=2 개수인 동안 인쇄합니다.
d의 카운트가 2에 도달하면 중지합니다.
awk '{ a[$1]++; if(a["b"]==1 && a["d"]<=2){ print; } if(a["d"]==2){ a["d"]=10 } }' file.txt