在awk中使用RS过滤块时如何保留RS

在awk中使用RS过滤块时如何保留RS,awk,Awk,我有以下数据,它是以块的形式出现的。每个块由两种字符串分隔: 九月一日 九月二日 以下是输入数据: echo "$y" sep1 abc def ghi sep2 jkl mno sep1 pqr sep2 stu sep1 vwx sep2 yz sep1 假设我要删除包含abc的块:我使用了以下命令: echo "$y" |awk -v RS='sep1|sep2' '!/abc/' jkl mno pqr stu vwx yz 它工作,但删除了原来的seperato

我有以下数据,它是以块的形式出现的。每个块由两种字符串分隔:

  • 九月一日
  • 九月二日
  • 以下是输入数据:

    echo "$y"
    sep1
    abc
    def
    ghi
    sep2
    jkl
    mno
    sep1
    pqr
    sep2
    stu
    sep1
    vwx
    sep2
    yz
    sep1
    
    假设我要删除包含
    abc
    的块:我使用了以下命令:

    echo "$y" |awk -v RS='sep1|sep2' '!/abc/'
    
    
    jkl
    mno
    
    
    pqr
    
    
    stu
    
    
    vwx
    
    
    yz
    
    它工作,但删除了原来的seperator。我如何保存它,以便输出如下:

    sep1
    
    sep2
    jkl
    mno
    sep1
    pqr
    sep2
    stu
    sep1
    vwx
    sep2
    yz
    sep1
    

    再来一次。使用GNU awk和
    RT

    $ awk 'BEGIN{RS="(sep1|sep2)\n"}/abc/{$0="\n"}{ORS=RT;print}' file
    sep1
          # only 1 empty line like in the expected output
    sep2
    jkl
    ...
    
    文档中提到了
    RT

    $ awk 'BEGIN{RS="(sep1|sep2)\n"}/abc/{$0="\n"}{ORS=RT;print}' file
    sep1
          # only 1 empty line like in the expected output
    sep2
    jkl
    ...
    

    RT
    在每次读取记录时设置。它包含与记录分隔符
    RS
    表示的文本相匹配的输入文本。此变量是一个gawk扩展。

    另一个go。使用GNU awk和
    RT

    $ awk 'BEGIN{RS="(sep1|sep2)\n"}/abc/{$0="\n"}{ORS=RT;print}' file
    sep1
          # only 1 empty line like in the expected output
    sep2
    jkl
    ...
    
    文档中提到了
    RT

    $ awk 'BEGIN{RS="(sep1|sep2)\n"}/abc/{$0="\n"}{ORS=RT;print}' file
    sep1
          # only 1 empty line like in the expected output
    sep2
    jkl
    ...
    
    RT
    在每次读取记录时设置。它包含与记录分隔符
    RS
    表示的文本相匹配的输入文本。此变量是一个gawk扩展。

    通过块处理(无
    RS
    模式):

    • if(r)print(r!~/abc/?r:)
      -如果存在且不包含
      abc
    • r=(r?r OR:)$0
      -累加每个块行

    输出:

    sep1    
    
    sep2
    jkl
    mno
    sep1
    pqr
    sep2
    stu
    sep1
    vwx
    sep2
    yz
    sep1
    
    通过块处理(无
    RS
    模式):

    • if(r)print(r!~/abc/?r:)
      -如果存在且不包含
      abc
    • r=(r?r OR:)$0
      -累加每个块行

    输出:

    sep1    
    
    sep2
    jkl
    mno
    sep1
    pqr
    sep2
    stu
    sep1
    vwx
    sep2
    yz
    sep1
    

    你好,詹姆斯,谢谢你的回复。但是,这对我没有帮助,因为我需要删除整个块。我所说的块是指当我选择
    abc
    时,
    def
    ghi
    也应该被删除。由于这三个都是由
    sep1
    sep2
    创建的一个块,所以我的坏消息。已编辑。@JamesBrown+1和我高度怀疑OPs 2分隔符的字面名称是
    sep1
    sep2
    ,因此您使用
    sep1 | sep2
    几乎可以肯定是正确的方法,尽管其中任何一个都很容易在必要时进行调整。OP已经将GNU awk用于多字符RS,因此也使用RT是有意义的。谢谢,你知道我能读到的关于
    RT
    的任何资源吗?我建议使用GNU awk文档,特别是4.1.2使用gawk进行记录拆分。测试几次,你已经掌握了它!你好,詹姆斯,谢谢你的回复。但是,这对我没有帮助,因为我需要删除整个块。我所说的块是指当我选择
    abc
    时,
    def
    ghi
    也应该被删除。由于这三个都是由
    sep1
    sep2
    创建的一个块,所以我的坏消息。已编辑。@JamesBrown+1和我高度怀疑OPs 2分隔符的字面名称是
    sep1
    sep2
    ,因此您使用
    sep1 | sep2
    几乎可以肯定是正确的方法,尽管其中任何一个都很容易在必要时进行调整。OP已经将GNU awk用于多字符RS,因此也使用RT是有意义的。谢谢,你知道我能读到的关于
    RT
    的任何资源吗?我建议使用GNU awk文档,特别是4.1.2使用gawk进行记录拆分。测试几次,你已经掌握了它!