【问题标题】:Multiple field separator in awk (Field separator being together )awk 中的多个字段分隔符(字段分隔符在一起)
【发布时间】:2014-10-14 17:19:53
【问题描述】:

我有一个文本文件

abc-AB9-3.2-def  
abc-5.6-def

我需要获取“-”符号之前后跟“任意数字”的字符串。
IE。在第一种情况下,我需要在 -3 之前获取字符串,在第二种情况下,我需要在 -5 之前获取字符串。

预期的输出是:

abc-AB9
abc

请帮忙。我的分隔符是“-”,后跟任意数字。

【问题讨论】:

    标签: shell awk sed grep sh


    【解决方案1】:

    你可以试试这个awk

    awk -F"-[0-9]+" '{print $1}'  yourfile
    

    (或)

    awk 'BEGIN{ FS="-[0-9]+" } {print $1}' yourfile
    

    另一种方式(如 Jotne 评论):

    awk -F"-[0-9]" '{$0=$1}1' yourfile
    

    【讨论】:

    • 我认为这是一个 GNU awk 解决方案。
    • @AvinashRaj 这是一个通用的awk 解决方案。如果这是RS,是的,那么你需要GNU awk
    • @sat 你不需要 + 符号,因为 OP 说任何数字,所以 "-[0-9]" 就足够了。您可以将其缩短为:awk -F"-[0-9]" '{$0=$1}1' file
    【解决方案2】:

    通过 sed,

    $ sed 's/^\(.*\)-[0-9].*/\1/g' file
    abc-AB9
    abc
    

    通过 grep,

    $ grep -oP '.*(?=-\d)' file
    abc-AB9
    abc
    

    【讨论】:

      【解决方案3】:
      perl -lne 'print $1 if(/(.*?)-\d.*/)' your_file
      

      测试:

      > cat temp
      abc-AB9-3.2-def  
      abc-5.6-def
      > perl -lne 'print $1 if(/(.*?)-\d.*/)' temp
      abc-AB9
      abc
      > 
      

      【讨论】:

        【解决方案4】:

        使用sed删除不相关的部分:

        sed 's/-[0-9].*//' input
        

        【讨论】:

          猜你喜欢
          • 2013-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多