如何从切割命令中获得第二个最后的字段
我有一组数据作为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
是倒数第二个元素