awk insert lines/records in a flagged print from match

awk insert lines/records in a flagged print from match

Awk 程序应处理许多数据文件。在每个数据文件中,它应查找模式并插入两行/带有新字段的记录。 (这只是一个例子。最终的程序必须在这个动作之后做更多的事情)。

数据文件作为例子

Rec not needed-1
Rec not needed-2
Rec not needed-n
start
Record-1
Record-2
Record-n

它是制表符分隔的,这里我们只有 1 美元。

源程序

BEGIN { OFS=FS="\t"}

FNR==1 {flag=0;} p; 
#flag && !=""{=; print}

=="Record-2" && flag{="";="newline1"; print; =""; ="newline2"; print}
#=="Record-2" {flag=1} p {=""; ="newline1"; print; =""; ="newline2"; print; flag=0} 1

flag!=0{print};
/start/{flag=1}

因为我使用 Windows 这是通过 GAWK 调用的。

想要的输出:

Record-1
        newline1
        newline2
Record-n

我的输出有 "newline2"

的复制问题
Record-1
        newline1
        newline2
        newline2
Record-n

我认为这个问题与"flags"的使用有关。但是为了执行我的 awk 程序的所有其他操作,

FNR==1 {flag=0;} p; 
...    
flag!=0{print};
/start/{flag=1}

应该保持不变 - 只要它不会 'harm'。谢谢。

正如你所说,因为flag,最后

flag!=0{print};

正在进行额外打印,因此您可以删除 =="Record-2" ... 中的最后打印:

BEGIN { OFS=FS="\t"}

FNR==1 {flag=0} 
#flag && !=""{=; print}

=="Record-2" && flag{="";="newline1"; print; ="newline2"}
#=="Record-2" {flag=1} p {=""; ="newline1"; print; =""; ="newline2"; print; flag=0} 1

flag!=0{print}
/start/{flag=1}

另一种选择是向 flag 添加另一个条件,但不知道这是否会扰乱您的脚本:

BEGIN { OFS=FS="\t"}

FNR==1 {flag=0} 
#flag && !=""{=; print}

!="Record-2" && flag!=0 {print}

=="Record-2" && flag{="";="newline1"; print; ="newline2"; print}
#=="Record-2" {flag=1} p {=""; ="newline1"; print; =""; ="newline2"; print; flag=0} 1

/start/{flag=1}

或者:

BEGIN { OFS=FS="\t"}

FNR==1 {flag=0} 
#flag && !=""{=; print}

=="Record-2" && flag{="newline1"; print "\t"; ="newline2"; print "\t"}
#=="Record-2" {flag=1} p {=""; ="newline1"; print; ="";    ="newline2"; print; flag=0} 1

!="Record-2" && flag!=0{print}
/start/{flag=1}