如何从剪切命令获取倒数第二个字段

Arc*_*ain 43 unix awk cut

我有一组数据作为输入,需要基于deleimiter的倒数第二个字段.这些行可能具有不同数量的分隔符.我怎样才能获得倒数第二场?

示例输入

text,blah,blaah,foo
this,is,another,text,line
Run Code Online (Sandbox Code Playgroud)

预期产出

blaah
text
Run Code Online (Sandbox Code Playgroud)

Arc*_*ain 81

除了最后两个令牌之外的Unix cut中得到一个提示并能够找到答案:

cat datafile | rev | cut -d '/' -f 2 | rev
Run Code Online (Sandbox Code Playgroud)

  • +1虽然仍然简洁但不使用awk ...虽然我也大部分时间都使用awk:P (4认同)

Chr*_*our 41

Awk很适合这个:

awk -F, '{print $(NF-1)}' file
Run Code Online (Sandbox Code Playgroud)

变量NF是一个特殊的awk变量,它包含当前记录中的字段数.

  • +1。我个人更喜欢纯 bash,但 awk 比大管道方法要好得多。 (2认同)

Cha*_*ffy 6

这里根本不需要使用cut,rev或任何其他外部工具.只需将每行读入一个数组,然后选择你想要的那一行:

while IFS=, read -r -a entries; do
  printf '%s\n' "${entries[${#entries[@]} - 2]}"
done <file
Run Code Online (Sandbox Code Playgroud)

在纯bash中执行此操作远比启动管道快,至少对于相当小的输入.对于大输入,更好的工具是awk.

  • 我不会说没有理由..对于一个简单的任务来说,这是一个讨厌的语法,我个人需要额外的纳秒.无论如何,+1给出了强大的bash解决方案. (6认同)
  • 当你可以使用bash结构时说没有理由使用外部工具就像说当你可以使用剪刀时没有理由使用割草机.shell只是一个环境,可以从中调用工具和操作文件和进程以及一些构造来对所有这些进行排序.与任何其他形式的构造一样,在构建软件时,只需为每个作业使用正确的工具. (4认同)
  • 然后再解释一下 - 对于输入它确实需要眨眼间以awk处理,你可以使用bash在稍微简短的眨眼间做到这一点,但随后随着数据的增长做好准备应对严重的性能损失.所以bash解决方案比awk编写起来更麻烦,并且在性能实际上是你需要关注的情况下(即在大型数据集上),运行速度远远低于awk.我能说的最好的是,除了作为学术练习之外,没有理由用bash写它,只是为了向人们展示如何使用bash结构. (4认同)