【问题标题】:Using AWK, how remove a section that contains a particular pattern使用 AWK,如何删除包含特定模式的部分
【发布时间】:2016-03-16 13:24:40
【问题描述】:

我是 AWK 的新手,但我需要从一个看起来不是很简单的规则开始,至少对我来说是这样。也许有人可以帮助我找到解决方案。

我需要搜索并删除一些包含特定模式的行。至于 bekow 示例:我需要删除包含名称“pippo2”的整个部分(三行)

输入文件:

   <Name>
      Pippo1
   </Name>
   <Name>
      Pippo2
   </Name>
   <Name>
      Pippo3
   </Name>

所需的输出文件:

   <Name>
      Pippo1
   </Name>
   <Name>
      Pippo3
   </Name>

一切顺利
毛罗


你好!
谢谢大家的建议。

但我很抱歉确认您的 cmets,实际上使用的结构有点复杂,建议的过滤器停止工作:-(

这是更复杂的结构:

  <Name>
     <data>Pippo1</data>
  </Name>
  <Name>
     <data>Pippo2</data>
  </Name>
  <LastName>
     <data>Pippo3</data>
  </LastName>

【问题讨论】:

  • 一般来说,对 xml 使用 awk 并不可靠。在这种简单的情况下你可以,但这种方法最终会咬你。
  • 说实话,它肯定会咬你。

标签: awk gawk


【解决方案1】:

gawk 来救援!

您需要一个能够识别正则表达式的 RS 用于以下(gawk 支持)

 awk -v RS="</[^>]+>" '!/Pippo2/{printf "%s", $0 RT}' pippos

   <Name>
      Pippo1
   </Name>
   <Name>
      Pippo3
   </Name>

【讨论】:

    【解决方案2】:

    如果文件t.dat 包含您的数据,则以下awk 脚本将完成这项工作:

    $ awk '/<Name>/{notFound=1} {str=str $0} /Pippo2/{notFound=0} /<\/Name>/{if(notFound){print str;} str=""; notFound=1;}' t.dat
    <Name>Pippo1</Name>
    <Name>Pippo3</Name>
    

    当然,这个解决方案不是很通用——它只适用于具有像你这样的架构的数据文件——每条记录(可能是多行)都用&lt;Name&gt; ... &lt;/Name&gt;标签括起来。

    【讨论】:

    • 顺便说一句,我同意您原始问题下的 cmets - 您不应该为此使用 AWK ... :)
    猜你喜欢
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2015-11-29
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2022-08-15
    相关资源
    最近更新 更多