首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk在来自匹配的标记打印中插入行/记录

awk在来自匹配的标记打印中插入行/记录
EN

Stack Overflow用户
提问于 2017-07-13 22:54:26
回答 1查看 69关注 0票数 0

Awk程序需要处理大量的数据文件。在每个数据文件中,应查找模式并插入两行/记录和新字段。(这只是一个示例。最终程序必须在此操作之后做更多的事情)。

数据文件为例

代码语言:javascript
复制
Rec not needed-1
Rec not needed-2
Rec not needed-n
start
Record-1
Record-2
Record-n

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

源程序

代码语言:javascript
复制
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。

想要的输出:

代码语言:javascript
复制
Record-1
        newline1
        newline2
Record-n

我的输出与"newline2“的混淆问题

代码语言:javascript
复制
Record-1
        newline1
        newline2
        newline2
Record-n

我认为这个问题与“标志”的使用有关。但是为了在工作中执行awk程序的所有其他操作,

代码语言:javascript
复制
FNR==1 {flag=0;} p; 
...    
flag!=0{print};
/start/{flag=1}

应该保持原样--只要它不会“伤害”。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 00:05:36

就像你说的,因为flag,最后一个

代码语言:javascript
复制
flag!=0{print};

正在执行额外的打印,因此您可以删除$1=="Record-2" ...中的最后一次打印

代码语言:javascript
复制
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添加另一个条件,但不知道这是否会弄乱您的脚本:

代码语言:javascript
复制
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}

或者:

代码语言:javascript
复制
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}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45084276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档