【问题标题】:How can I remove suffix of string in cut result (bash)?如何删除剪切结果(bash)中的字符串后缀?
【发布时间】:2014-01-22 06:59:02
【问题描述】:

我想删除cut 命令的所有结果行中特定字符“/”之后的所有字符 我该如何使用 bash 命令来做到这一点?

例如,如果cut -f2 file 结果:

John.Micheal/22
Erik.Conner/19
Damian.Lewis/40

我需要这个输出:

John.Micheal
Erik.Conner
Damian.Lewis

【问题讨论】:

    标签: string bash awk cut


    【解决方案1】:

    您可以使用/ 作为字段分隔符将其通过管道传送到另一个cut

    cut -f2 file | cut -f1 -d/
    

    或者您可以使用sed 切断/ 之外的所有内容:

    cut -f2 file | sed 's?/.*??'
    

    或者您可以使用带有自定义字段分隔符的单个 awk,假设第一个字段中没有 /

    awk -F'[\t/]' '{print $2}' file
    

    如果第一个字段可以有/,那么最好使用前两个建议。

    【讨论】:

    • 您的awk 命令假定第一个制表符分隔字段中没有/
    【解决方案2】:

    或者使用纯 bash while 循环逐行读取到 shell 变量中。一种选择:

    cut -f2 file | while IFS=/ read -r a _; do echo "$a"; done
    

    另一种选择:

    cut -f2 file | while read -r a; do echo "${a%/*}"; done
    

    第一个在读取时使用IFS分词,另一个使用参数扩展。

    【讨论】:

      【解决方案3】:

      在不知道你的文件是什么样子的情况下,最好按照@janos 的建议将cut -f2 file 的结果通过管道传递给另一个cutawksed,或者使用@kastelian 的方法

      因为cut -f2 file给了你

      John.Micheal/22
      Erik.Conner/19
      Damian.Lewis/40
      

      我猜这就是你的原始文件的样子

      ab/c    John.Micheal/22 abc/23
      de      Erik.Conner/df  abc
              Damian.Lewis/40 def/999
      

      而不是cut 和管道输出到另一个命令,你可以直接得到结果
      获取第一个制表符和第一个/之后制表符之间的字符串

       sed  's@^[^\t]*[\t]\+\([^/]\+\)/.*@\1@' file
      

      或者如果你有 GNU sed

       sed -r 's@^[^\t]*[\t]+([^/]+)/.*@\1@' file
      

      【讨论】:

        【解决方案4】:

        只需使用 awk 即可:

        awk -F'\t' '{split($2,a,"/"); print a[1]}' file
        

        如果您的前 2 个字段中没有其他“/”,那么您可以简化为:

        awk -F'[\t/]' '{print $2}' file
        

        【讨论】:

          猜你喜欢
          • 2015-03-27
          • 1970-01-01
          • 2013-05-10
          • 2011-07-14
          • 1970-01-01
          • 2021-07-18
          • 1970-01-01
          • 2015-02-23
          相关资源
          最近更新 更多