首页 文章

如何使用'cut'找到最后一个字段

提问于
浏览
198

如果不使用 sedawk ,只有 cut ,当字段数量未知或每行更改时,如何获取最后一个字段?

11 回答

  • 65

    你可以用bash shell编写一个小程序 .

    你可以参考我的bash shell https://www.huuphan.com/2018/06/split-string-in-shell-and-get-last-field.html

    我希望这对你有所帮助!

  • 451

    仅使用 cut 是不可能的 . 这是一种使用 grep 的方法:

    grep -o '[^,]*$'
    

    替换其他分隔符的逗号 .

  • 6

    你可以尝试这样的事情:

    echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
    

    Explanation

    • maps.google.com的反面将是 moc.elgoog.spam

    • cut 使用点作为分隔符并选择第一个字段,即 moc

    • 最后,我们再次将其反转(感谢提醒,@ tom)获取 com

  • 0

    以下实现A friend's suggestion

    #!/bin/bash
    rcut(){
    
      nu="$( echo $1 | cut -d"$DELIM" -f 2-  )"
      if [ "$nu" != "$1" ]
      then
        rcut "$nu"
      else
        echo "$nu"
      fi
    }
    
    $ export DELIM=.
    $ rcut a.b.c.d
    d
    
  • -1

    我意识到如果我们只确保存在一个尾随分隔符,它就可以工作 . 所以在我的情况下,我有逗号和空格分隔符 . 我在最后加了一个空格; $ ans="a, b" $ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2 b

  • 0

    如果您的输入字符串不包含正斜杠,那么您可以使用 basename 和子shell:

    $ basename "$(echo 'maps.google.com' | tr '.' '/')"
    

    这不使用 sedawk ,但它也不使用 cut ,所以我不太确定它是否有资格作为问题的答案 .

    这不是有效输入字符串的一部分 . 例如,管道( | )字符也不允许在文件名中,因此这将起作用:

    $ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
    
  • 95

    使用参数扩展 . 这比任何类型的外部命令(包括 cut (或 grep ))更有效 .

    data=foo,bar,baz,qux
    last=${data##*,}
    

    有关bash中本机字符串操作的介绍,请参阅BashFAQ #100 .

  • 1

    这是唯一可以使用除切割之外的解决方案:

    echo“s.t.r.i.n.g . ” |切-d' . ' -f2- [repeat_following_part_forever_or_until_out_of_memory:] |切-d' . ' -f2-

    使用此解决方案,字段的数量确实可以是未知的,并且不时变化 . 但是,由于行长度不得超过LINE_MAX字符或字段(包括换行符),因此任意数量的字段永远不能成为此解决方案的真实条件 .

    是的,这是一个非常愚蠢的解决方案,但是我认为唯一符合标准的解决方案 .

  • 14

    如果你有一个名为filelist.txt的文件,它是一个列表路径,如下所示:c:/dir1/dir2/file1.h c:/dir1/dir2/dir3/file2.h

    然后你可以这样做:rev filelist.txt | cut -d“/” - f1 |转

  • 0

    没有awk?...但是用awk这么简单:

    echo 'maps.google.com' | awk -F. '{print $NF}'
    

    AWK是一种更强大的工具,可放在口袋里 . -F if if field separator NF是字段数(也代表最后一个的索引)

  • 12

    有多种方式 . 你也可以用它 .

    echo "Your string here"| tr ' ' '\n' | tail -n1
    > here
    

    显然,tr命令的空格输入应该用你需要的分隔符替换 .

相关问题