awk를 사용하여 한 일치 항목의 행을 별도 일치 항목의 두 번째 인스턴스로 인쇄합니다.

awk를 사용하여 한 일치 항목의 행을 별도 일치 항목의 두 번째 인스턴스로 인쇄합니다.

요청이 있습니다. 내 파일 내용이 다음과 같다고 가정해 보겠습니다.

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

  1. 더 읽기 쉬운 코드. 문자 수를 추적하세요.
  2. b=1 및 d<=2 개수인 동안 인쇄합니다.
  3. d의 카운트가 2에 도달하면 중지합니다.

    awk '{ a[$1]++;
        if(a["b"]==1 && a["d"]<=2){
            print;
        }
        if(a["d"]==2){
           a["d"]=10
        }
    }' file.txt
    

관련 정보