我正在尝试在应用拆分后获取字符串的最后一个子字段。当我不知道吐出结果中最后一个字段的值是什么时,问题就出现了。
例如样本数据
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
答案 0 :(得分:3)
使用split()
函数的返回值并将其用作数组下标
awk -F, '{n=split($NF,a,":");print a[n]}' file
bar
zoo
data
返回值是由限制器:
分割的字段数,您可以将其应用于您选择的任何字符。
从split()
功能
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}'