48

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

示例输入

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

预期产出

blaah
text
4

6 回答 6

85

Got a hint from Unix cut except last two tokens and able to figure out the answer :

cat datafile | rev | cut -d '/' -f 2 | rev
于 2013-07-14T21:36:18.907 回答
44

awk 非常适合这个:

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

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

于 2013-07-14T21:45:12.843 回答
6

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

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

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

于 2013-07-14T21:44:10.497 回答
3

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

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

$ cuts -2 file.txt
blaah
text

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

- 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

以及更多。

在对 Unixcuts的太多限制感到沮丧之后,我写了这篇文章。cut它旨在用多个分隔符变体替换来自多个文件的各种cut/paste组合、切片和切块列,同时尽量减少用户的输入。

您可以cuts从 github 获取(免费软件、Artistic 许可证): https ://github.com/arielf/cuts/

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

于 2014-07-03T00:34:37.410 回答
3

Perl 解决方案类似于来自@iiSeymour 的 awk 解决方案

perl -lane 'print $F[-2]' file

使用这些命令行选项:

  • n循环输入文件的每一行,不要自动打印每一行

  • l在处理之前删除换行符,然后将它们添加回来

  • a自动拆分模式 - 将输入行拆分为 @F 数组。默认为空格分割

  • e执行 perl 代码

@F自动拆分数组从索引 [0] 开始,而 awk 字段以 $1 开始是
-1最后一个元素
-2是倒数第二个元素

于 2015-09-10T18:32:17.417 回答
2

GNU 的代码:

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

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

代码示例类似于 sudo_O 的awk 代码

$ sed -r 's/.*,(\w+),\w+$/\1/' 文件
废话
文本

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

于 2013-07-14T22:48:29.447 回答