【问题标题】:Remove a line with a specific pattern in one field在一个字段中删除具有特定模式的行
【发布时间】:2013-06-15 13:16:05
【问题描述】:

下面是我的输入文件,input.txt:

Value Value1 value2
5 1 2
1 4 3
2 1 5.5
0 0 0
4 1 0

我需要搜索第三列中的值(5.5),如果找到我需要完全删除该行。

我需要如下输出,output.txt:

Value Value1 value2
5 1 2
1 4 3
0 0 0
4 1 0

我已尝试使用 awk 命令删除该行,但我被下面的部分(???)卡住了。不要如何从 awk 命令中删除整行。请提出实现这一目标的方法。谢谢!
awk -F"\t" '{if($3==5.5) ??? }'

【问题讨论】:

    标签: regex perl sed awk pattern-matching


    【解决方案1】:

    如果您想排除所有第三列值为5.5 的行,则:

    awk '$3!=5.5' filename
    

    【讨论】:

    • 感谢回复。 awk '$3!=5.5' filename 这个命令可以在没有 if 条件的情况下工作,如果它太基本了,抱歉。目前我没有电脑可以测试,稍后再试。
    • 是的。 awk 默认打印所有行。所以条件是排除第三列值为5.5的行。
    【解决方案2】:

    GNU 更安全的 sed

    sed -r '/\s*(\S+\s+){2}5.5/d' file
    

    【讨论】:

      【解决方案3】:
      perl -lane 'next if($F[2]=~/5.5/);print' your_file
      

      如果第三列有 5.5,那么该行将被删除。 但是如果第三列是 5.52 或 15.53,那么使用上面的命令它们将被删除。 因此,如果您只想删除具有 5.5 完全匹配的行,请使用以下内容:

      perl -lane 'next if($F[2]=~/\b5.5\b/);print' your_file
      

      测试如下:

      > cat temp
      Value Value1 value2 
      5 1 2 
      1 4 3 
      2 1 5.51 
      2 1 5.5 
      0 0 0 
      4 1 0
      > 
      

      使用第一个命令:

      > perl -lane 'next if($F[2]=~/5.5/);print' temp
      Value Value1 value2 
      5 1 2 
      1 4 3 
      0 0 0 
      4 1 0
      > 
      

      使用第二个命令:

      > perl -lane 'next if($F[2]=~/\b5.5\b/);print' temp
      Value Value1 value2 
      5 1 2 
      1 4 3 
      2 1 5.51 
      0 0 0 
      4 1 0
      >
      

      【讨论】:

      • 我更喜欢unless: print unless($F[2]=~/5.5/);。似乎更具可读性。 YMMV。
      • 感谢您的回复,我使用 awk 解决了这个问题。
      • 这里有一个错误。匹配应为$F[2]=~/5\.5/。但我不禁想知道你为什么不使用$F[2] eq '5.5'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      相关资源
      最近更新 更多