Com POSIX awk
:
awk '
$0 == "ABCD" { n = 1 }
$0 == "EFGH" { n = 0 }
/^Toto/ && n { $0 = "Record n°" n++ "#" $0 }
1
' <file
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
Com POSIX awk
:
awk '
$0 == "ABCD" { n = 1 }
$0 == "EFGH" { n = 0 }
/^Toto/ && n { $0 = "Record n°" n++ "#" $0 }
1
' <file
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
Tags text-processing awk