使用 awk,如何仅在以“Toto”开头的行位于特定模式对之间时插入数字

使用 awk,如何仅在以“Toto”开头的行位于特定模式对之间时插入数字

使用 awk,我想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

相关内容