我有一组数据作为输入,需要基于deleimiter的倒数第二个字段。这些行可能具有不同数量的分隔符。我怎样才能获得倒数第二场?
示例输入
text,blah,blaah,foo
this,is,another,text,line
预期产出
blaah
text
答案 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)
根本不需要使用cut
,rev
或任何其他外部工具来进行bash。只需将每一行读入一个数组,然后挑选出你想要的那一行:
while IFS=, read -r -a entries; do
printf '%s\n' "${entries[${#entries[@]} - 2]}"
done <file
在纯bash中执行此操作远比启动管道要快,至少对于相当小的输入。对于大输入,更好的工具是awk。
答案 3 :(得分:2)
GNU代码sed:
$ 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
答案 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
消息。