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}
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}