
awkを使用して2つの特定のパターンとの間にある場合にのみ開始し、Record n°i#
各行の前に数字を挿入したいと思います。Toto
start=ABCD
stop=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