如何在拆分列后找到最后的子字段

时间:2017-03-23 09:04:38

标签: awk

我正在尝试在应用拆分后获取字符串的最后一个子字段。当我不知道吐出结果中最后一个字段的值是什么时,问题就出现了。

例如样本数据

hey,there,how,are,you:bla:bla:foo:bar
hey,this,is ,meaningless,text,and ,the,field,are,more:zoo,zoo
hello,folks,thanks,example:is:this:is:a:line:and:I:could:not:think:of:dummy:data

现在我可以使用NF来获取最后一个字段。

示例:

awk -F, '{print $NF}' input
you:bla:bla:foo:bar
more:zoo,zoo
example:is:this:is:a:line:and:I:could:not:think:of:dummy:data

现在,如果我可以使用split函数获取任何字段:

awk -F, '{split($NF,a,":");print a[1]}' input
you
more
example

现在我不想要第N个字段,我需要提取第N个字段的最后子字段。

所以我想要的输出是:

bar
zoo
data

请注意,以下内容 NOT 非常有用,因为这仅对最后一列有用。

sed -r 's/(^.*:)(.*)/\2/g' inut
bar
zoo
data

3 个答案:

答案 0 :(得分:3)

使用split()函数的返回值并将其用作数组下标

awk -F, '{n=split($NF,a,":");print a[n]}' file
bar
zoo
data

返回值是由限制器:分割的字段数,您可以将其应用于您选择的任何字符。

split()功能

GNU Awk页面引用
  

split(string,array [,fieldsep [,seps]])

     

如果 fieldsep 是单个空格,则任何前导空格都会进入seps [0],任何尾随空格都会进入seps [n],其中n是split()的返回值(即数组中元素的数量)。

答案 1 :(得分:2)

你也可以使用rev来做 sdrawkcab ,即。得到第一个:

$ rev file | awk -F, '{split($1,a,":");print a[1]}' | rev
bar
zoo
data

我仍然像@Inian那样做。

答案 2 :(得分:1)

@inian的解决方案更通用,2替代特定于您的第5个字段和LAST子元素。 在这两种情况下,我都假设没有嘈杂的';'或者像数据样本中的':'(转义或字符串)。

sed版本(假设第5个字段)

sed 's/^\([^;]*\)\{5\}[^;]*:\([^;]*\).*/\2/' YourFile

awk版本(没有拆分)

 awk -F ',' '{ sub( /.*:/, "", $5); print $5}'