如何从切割命令中获得第二个最后的字段

我有一组数据作为input,并需要基于删减器的第二个最后一个字段。 这些行可能有不同数量的分隔符。 我怎样才能获得第二个最后的领域?

示例input

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

预期产出

 blaah text 

除了最后两个令牌之外,从Unix上得到了一个提示,能够找出答案:

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

awk很适合这个:

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

variablesNF是一个特殊的awkvariables,它包含当前logging中的字段数。

在这里根本就不需要使用cut ,转换或其他任何工具。 只要将每一行读入一个数组,然后挑出你想要的那一块:

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

以纯粹的bash来做这件事比开启一条pipe道要快得多,至less在合理的小input的情况下。 对于大量input,更好的工具是awk。

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 /'
文本

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

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

使用更专用的CSV文件程序可能会更好,例如。 awk或excel 。

这个问题最简单的答案是使用我的cuts工具:

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

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

 - 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 

以及更多。

我在cuts Unix的太多限制后感到沮丧。 它旨在从多个文件中replace各种cut / paste组合,切片和切块列,以及多个分隔符变体,同时从用户处实现最小限度的打字。

你可以从Github获得cuts (免费软件,艺术许可证): https : //github.com/arielf/cuts/

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

Perl解决scheme类似于@iiSeymour的awk解决scheme

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

这些命令行选项被使用:

  • n循环input文件的每一行,不会自动打印每一行

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

  • 自动分割模式 – 将input行分割成@F数组。 默认分割为空格

  • e执行Perl代码

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