awkを使用して「Toto」で始まる行が特定のパターンペアの間にある場合にのみ数値を挿入する方法

awkを使用して「Toto」で始まる行が特定のパターンペアの間にある場合にのみ数値を挿入する方法

awkを使用して2つの特定のパターンとの間にある場合にのみ開始し、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

おすすめ記事