强制grep两次抓取匹配行

时间:2016-11-03 22:00:36

标签: awk grep duplicates

假设我有:

Z 10  
Z 11  
Y 10    

我用过:

$ grep "Z" <above_file> -A 1
Z 10  
Z 11  
Y 10  

我怎样才能让它返回:

Z 10  
Z 11  
Z 11  
Y 10  

本质上,如果grep看到下一行也与模式匹配,我希望它重复。是最好的/唯一的解决方案是手动逐行或使用带条件的复杂awk语句?在这一步之后还有进一步的处理,但这是阻碍我的边缘情况。

2 个答案:

答案 0 :(得分:1)

尝试:

$ awk 'f{print; f=0} /Z/{print; f=1}' file
Z 10
Z 11
Z 11
Y 10

如何运作

Awk一次隐含地读取输入文件一行。该脚本使用单个变量f,如果前一行与Z匹配,则该变量为真(非零)。

  • f{print; f=0}

    如果f非零,请打印此行并设置f=0

  • /Z/{print; f=1}

    如果此行与正则表达式Z匹配,则打印此行并设置f=1

请注意,无需初始化f。在awk中,未定义的变量默认为零(在数字上下文中)或空字符串(在字符上下文中)。在任何一种情况下,未定义的变量都是逻辑假的。

答案 1 :(得分:0)

也许这也会这样做:

$ sed -n ':check /^Z/ {p; n; h; p; x; b check}' file

- :check是分支的标签,用于匹配/^Z/的行(因此,从Z开始)sed经历循环:

  1. p线(=打印匹配的行)
  2. 转到n分机
  3. 将其复制到h旧缓冲区
  4. p rint it (=匹配后打印行)
  5. e x更改该行,即将h旧缓冲区移回(=匹配后返回该行)
  6. 如果该行匹配b (=检查) ,则
  7. check^Z牧场重复整个过程

    原则上,sed对这种递归应该是好的(sed不存储任何堆栈,对吧?),但它可能不是。 此外,我不确定脚本是否真的正确:)