使用 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