我有一组数据作为输入,需要基于分隔符的倒数第二个字段。这些行可能有不同数量的分隔符。我怎样才能获得倒数第二场?
示例输入
text,blah,blaah,foo
this,is,another,text,line
预期产出
blaah
text
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
awk 非常适合这个:
awk -F, '{print $(NF-1)}' file
变量 NF 是一个特殊的 awk 变量,它包含当前记录中的字段数。
这里根本不需要使用cut
,rev
或任何其他 bash 外部的工具。只需将每一行读入一个数组,然后选择你想要的部分:
while IFS=, read -r -a entries; do
printf '%s\n' "${entries[${#entries[@]} - 2]}"
done <file
在纯 bash 中执行此操作比启动管道要快得多,至少对于相当小的输入而言。对于大输入,更好的工具是 awk。
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
消息。
Perl 解决方案类似于来自@iiSeymour 的 awk 解决方案
perl -lane 'print $F[-2]' file
使用这些命令行选项:
n
循环输入文件的每一行,不要自动打印每一行
l
在处理之前删除换行符,然后将它们添加回来
a
自动拆分模式 - 将输入行拆分为 @F 数组。默认为空格分割
e
执行 perl 代码
@F
自动拆分数组从索引 [0] 开始,而 awk 字段以 $1 开始是
-1
最后一个元素
-2
是倒数第二个元素