Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何从cut命令中获取最后一个字段_Unix_Awk_Cut_Sed_Excel - Fatal编程技术网

Unix 如何从cut命令中获取最后一个字段

Unix 如何从cut命令中获取最后一个字段,unix,awk,cut,sed,excel,Unix,Awk,Cut,Sed,Excel,我有一组数据作为输入,需要基于deleimiter的最后一个字段。这些行可能具有不同的分隔符编号。我怎样才能得到最后一个字段 示例输入 text,blah,blaah,foo this,is,another,text,line 预期产量 blaah text 从中得到提示并能够找出答案: cat datafile | rev | cut -d '/' -f 2 | rev 这里根本不需要使用bash外部的cut、rev或任何其他工具。只需将每一行读入一个数组,然后选择所需的片段: whil

我有一组数据作为输入,需要基于deleimiter的最后一个字段。这些行可能具有不同的分隔符编号。我怎样才能得到最后一个字段

示例输入

text,blah,blaah,foo
this,is,another,text,line
预期产量

blaah
text
从中得到提示并能够找出答案:

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

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

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

doneAwk非常适合以下情况:

awk -F, '{print $(NF-1)}' file
变量NF是一个特殊的awk变量,它包含当前记录中的字段数

GNU的代码:

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

这个问题最简单的答案是使用我的
cuts
实用程序: 削减,代表“类固醇削减”:

还有更多

在对Unix上的
cut
的太多限制感到沮丧之后,我写了
cuts
。它的设计目的是用多个分隔符变体替换各种
剪切
/
粘贴
组合、多个文件的切片和切分列,同时尽量减少用户的键入

您可以从github获得
剪切
(免费软件,艺术许可证):


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

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

perl -lane 'print $F[-2]' file
使用以下命令行选项:

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

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

  • a
    autosplit模式–将输入行拆分为@F数组。默认为按空格拆分

  • e
    执行perl代码

@F
autosplit数组从索引[0]开始,而awk字段从$1开始
-1
是最后一个元素

-2
是倒数第二个元素

+1。我个人更喜欢纯bash,但awk比大型管道方法要好得多。我不会说没有理由。。对于一个简单的任务来说,这是一个非常糟糕的语法,我个人会额外花费几纳秒。不管怎样,+1表示提供了一个健壮的bash解决方案。如果说可以使用bash结构时没有理由使用外部工具,就像说可以使用剪刀时没有理由使用割草机一样。shell只是一个环境,从中可以调用工具、操作文件和进程,以及一些结构来对所有这些进行排序。就像任何其他形式的构造一样,在构造软件时,只需为每项工作使用正确的工具。@EdMorton这可能是一个很好的解释,但它实际上并不符合世界的现状。bash是一个相当完整的编程环境,它提供了在进程中执行大多数常见操作所必需的工具。您不会编写为Python内置的操作调用外部工具的Python代码;“为什么要在bash中这样做?”埃德默顿……再深入一点:这不是你爷爷的Bourne shell。bash具有正确的数组(C字符串)、映射/哈希数据类型和间接变量引用。40年前,shell可能只是一个工具,它除了设置管道外什么都不做,但现在不是了。换言之,对于在awk中只需眨眼就可以处理的输入,您可以使用bash在眨眼间完成它,但随后随着数据的增长,您就可以为严重的性能损失做好准备。因此,bash解决方案编写起来比awk更麻烦,而且在性能实际上是您关心的事情的情况下(即在大型数据集上),运行速度比awk慢得多。我能说的最好的是,没有理由在bash中编写它,而只是作为一个学术练习,向人们展示如何使用bash结构。这不会得到倒数第二个字段,并且它限制为每行固定数量的字段。我不会为此使用正则表达式。+1表示在保持简洁的同时不使用awk…尽管我大部分时间也使用awk:P
rev
实际上可以将文件作为参数,因此这是UUoC case保持线性顺序不是也永远不会是“UUoC”@SergiyKolodyazhnyy@JanKyuPeblik请解释一下。cat的好处是什么?有两个进程通过管道进行额外缓冲,而不是只有一个rev进程实现与两个相同的结果?JanKyuPeblik抱歉,但仍不清楚。“保持线性顺序”在这里似乎没有必要,特别是因为答案表明,他们实际上是先反转行进行处理,然后再反转
cat数据文件| rev
rev数据文件
相比没有明显的优势,谢谢分享您的脚本!也许“极简主义”并不是描述它的最佳方式,因为需要安装一个perl脚本,但拥有这样一个包含UNIX理念的智能工具肯定很有用。我要把这个藏在我的肚子里。。。 $ sed -r 's/.*,(\w+),\w+$/\1/' file blaah text
$ 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
perl -lane 'print $F[-2]' file