【问题标题】:awk insert lines/records in a flagged print from matchawk 在匹配的标记打印中插入行/记录
【发布时间】:2017-07-14 00:25:39
【问题描述】:

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}

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

【问题讨论】:

  • 您能否在此处添加更清晰的示例 Input_file 和预期的输出文件?

标签: awk gawk


【解决方案1】:

如你所说,因为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}

【讨论】:

  • 我工作。我目前选择第一个解决方案,我省略了打印。无论如何,我将仔细研究其他解决方案。非常感谢。
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2020-04-16
  • 2011-06-20
相关资源
最近更新 更多