awk를 사용하여 "Toto"로 시작하는 줄이 특정 패턴 쌍 사이에 있는 경우에만 숫자를 삽입하는 방법

awk를 사용하여 "Toto"로 시작하는 줄이 특정 패턴 쌍 사이에 있는 경우에만 숫자를 삽입하는 방법

awk를 사용하여 두 개의 특정 패턴과 사이에 있는 경우에만 시작하여 Record n°i#각 줄 앞에 숫자를 삽입 하고 싶습니다 .Totostart=ABCDstop=EFGH

입력 파일은 다음과 같습니다. ( Blabla실제로는 무엇이든 될 수 있음)

Blabla Toto Blabla
Blabla Toto
Toto Blabla
ABCD
Toto Blabla
Toto Blabla
Blabla
Toto Blabla
EFGH
Toto Blabla
Blabla Toto Blabla
Blabla Toto
ABCD
Toto Blabla
Blabla Toto
Toto Blabla
Toto Blabla
Blabla
EFGH
Toto Blabla
Blabla Toto

필요한 출력 파일은 다음과 같습니다.

Blabla Toto Blabla
Blabla Toto
Toto Blabla
ABCD
Record n°1#Toto Blabla
Record n°2#Toto Blabla
Blabla
Record n°3#Toto Blabla
EFGH
Toto Blabla
Blabla Toto Blabla
Blabla Toto
ABCD
Record n°1#Toto Blabla
Blabla Toto
Record n°2#Toto Blabla
Record n°3#Toto Blabla
Blabla
EFGH
Toto Blabla
Blabla Toto

다음 스크립트(bash 및 gawk v4.0.1에서 실행해야 함)를 시도했지만 작동하지 않습니다.

#!/bin/bash
awk 'BEGIN{indice=1; FS="\n"; RS=""}/^ABCD$/,/^EFGH$/{if(/^Toto/){sub(/^Toto/,"Record n° "indice"\\#Toto"); indice++}print}' input.txt > output.txt

답변1

글쎄요, cuonglm이 저를 이겼어요…

awk  '/EFGH/{flag=0};
      /ABCD/{flag=1};
      { 
        if (flag && $1=="Toto" && $2=="Blabla"){
          counter++;print "Record n° "counter, $0}
      }' in.txt

또는 더 압축하면 다음과 같습니다.

awk '/EFGH/{flag=0};/ABCD/{flag=1};{if (flag&&$1=="Toto"&&$2=="Blabla"){counter++;print "Record n° "counter, $0}}' in.txt

답변2

POSIX 사용 awk:

awk '
  $0 == "ABCD" { n = 1 }
  $0 == "EFGH" { n = 0 }
  /^Toto/ && n { $0 = "Record n°" n++ "#" $0 }
  1
' <file

관련 정보