Com awk, como inserir um número apenas para linhas que começam com “Toto” quando estão entre um par específico de padrões

1

Com o awk, gostaria de inserir uma numeração como Record n°i# na frente de cada linha, começando com Toto apenas quando eles estiverem localizados entre dois padrões específicos start=ABCD e stop=EFGH .

O arquivo de entrada é: (o Blabla pode ser qualquer coisa na realidade)

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

O arquivo de saída desejado é:

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

Eu tentei o seguinte script (que deve ser executado sobre o bash e o gawk v4.0.1), mas não funciona:

#!/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
    
por Syl87 04.09.2015 / 18:57

2 respostas

2

Com POSIX awk :

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

Bem cuonglm me bateu a ele ...

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

Ou mais compactado:

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