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 && $1!=""{$1=$1; print}
$1=="Record-2" && flag{$1="";$2="newline1"; print; $1=""; $2="newline2"; print}
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="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我认为这个问题与“标志”的使用有关。但是为了在工作中执行awk程序的所有其他操作,
FNR==1 {flag=0;} p;
...
flag!=0{print};
/start/{flag=1}应该保持原样--只要它不会“伤害”。谢谢。
发布于 2017-07-14 00:05:36
就像你说的,因为flag,最后一个
flag!=0{print};正在执行额外的打印,因此您可以删除$1=="Record-2" ...中的最后一次打印
BEGIN { OFS=FS="\t"}
FNR==1 {flag=0}
#flag && $1!=""{$1=$1; print}
$1=="Record-2" && flag{$1="";$2="newline1"; print; $2="newline2"}
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1
flag!=0{print}
/start/{flag=1}另一种选择是向flag添加另一个条件,但不知道这是否会弄乱您的脚本:
BEGIN { OFS=FS="\t"}
FNR==1 {flag=0}
#flag && $1!=""{$1=$1; print}
$1!="Record-2" && flag!=0 {print}
$1=="Record-2" && flag{$1="";$2="newline1"; print; $2="newline2"; print}
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1
/start/{flag=1}或者:
BEGIN { OFS=FS="\t"}
FNR==1 {flag=0}
#flag && $1!=""{$1=$1; print}
$1=="Record-2" && flag{$2="newline1"; print "\t"$2; $2="newline2"; print "\t"$2}
#$1=="Record-2" {flag=1} p {$1=""; $2="newline1"; print; $1=""; $2="newline2"; print; flag=0} 1
$1!="Record-2" && flag!=0{print}
/start/{flag=1}https://stackoverflow.com/questions/45084276
复制相似问题