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

时间:2013-07-14 21:32:22

标签: unix awk cut

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

示例输入

text,blah,blaah,foo
this,is,another,text,line

预期产出

blaah
text

5 个答案:

答案 0 :(得分:78)

得到Unix cut except last two tokens的提示并能够找到答案:

cat datafile | rev | cut -d '/' -f 2 | rev

答案 1 :(得分:39)

Awk很适合这个:

awk -F, '{print $(NF-1)}' file

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

答案 2 :(得分:6)

根本不需要使用cutrev或任何其他外部工具来进行bash。只需将每一行读入一个数组,然后挑选出你想要的那一行:

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

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

答案 3 :(得分:2)

GNU代码

$ echo text,blah,blaah,foo|sed -r 's/^(\S+,){2}(\S+),.*/\2/'
blaah

$ echo this,is,another,text,line|sed -r 's/^(\S+,){2}(\S+),.*/\2/'
text

类似于sudo_O的代码示例awk code

$ sed -r 's/.*,(\w+),\w+$/\1/' file
blaah
text

CSV文件使用更专业的程序可能更好,例如。

答案 4 :(得分:1)

这个问题的最简约的答案是使用我的cuts实用程序:

$ cat file.txt
text,blah,blaah,foo
this,is,another,text,line

$ cuts -2 file.txt
blaah
text

削减,代表“削减类固醇”:

- automatically figures out the input field separators
- supports multi-char (and regexp) separators
- automatically pastes (side-by-side) multiple columns from multiple files
- supports negative offsets (from end of line)
- has good defaults to save typing + allows the user to override them

等等。

我对在Unix上cuts的太多限制感到沮丧后写了cut。它旨在替换多个文件中的各种cut / paste组合,切片和切块列,具有多个分隔符变体,同时对用户施加最少的输入。

您可以从github获取cuts(免费软件,艺术许可):https://github.com/arielf/cuts/

不带参数调用cuts将打印详细的Usage消息。