【问题标题】:Unix delete line containing more than one dash包含多个破折号的 Unix 删除行
【发布时间】:2014-04-30 09:11:30
【问题描述】:

我在一个文件中有大约 1200 万行,我想删除包含多个破折号的行。举几个例子:

例子 例子

可能有任何变化。 sed、awk、grep 或其他任何东西都可以工作。

非常感谢。

【问题讨论】:

    标签: regex shell unix awk sed


    【解决方案1】:

    您可以使用将破折号设置为字段分隔符的字段数:

    awk -F- 'NF<=2' file
    

    要替换当前文件,你可以这样做:

    awk -F- 'NF<=2' file > tmp_file && mv tmp_file file
    

    说明

    • -F-- 设置为字段分隔符。
    • NF 代表字段数。
    • NF&lt;=2 在字段数为 1 或 2 时为真,这意味着该行包含 0 或 1 个破折号。因此,它不会打印任何包含两个以上字段(即 2 个或更多破折号)的行。

    测试

    $ cat a
    e--xa-mple
    e-xa-mple
    example
    e-xample
    
    $ awk -F- 'NF<=2' a
    example
    e-xample
    

    【讨论】:

    • awk -F- 'NF&lt;3' 可以使用:)
    • 是的,或者awk -F- '! (NF&gt;2)' :D 我更愿意指出我想要的限制,而不是我不想要的第一个限制。但当然,每个人都有自己的口味:)
    【解决方案2】:

    sed中的简单一:

    sed '/-.*-/d' yourfile
    

    或更快,避免在出现第二个破折号时扫描整行:

    sed '/-[^-]*-/d' yourfile
    

    【讨论】:

      【解决方案3】:

      单线perl

      perl -ne "print unless /-.*-/" file
      

      【讨论】:

        【解决方案4】:

        我想应该有人放

        grep -v '-.*-'
        

        也在这里,尽管我个人会使用来自@Gilles Arcas 的 答案

        【讨论】:

          猜你喜欢
          • 2016-05-08
          • 2012-12-12
          • 1970-01-01
          • 2016-12-06
          • 1970-01-01
          • 1970-01-01
          • 2011-08-25
          • 2011-02-12
          • 1970-01-01
          相关资源
          最近更新 更多