【问题标题】:How to find the LAST sub-field after splitting a column拆分列后如何找到最后一个子字段
【发布时间】:2017-03-23 21:25:54
【问题描述】:

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

例如示例数据

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 个字段的 LAST 子字段。

所以我想要的输出是:

bar
zoo
data

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

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

【问题讨论】:

  • 我可以得到第一列或第二列等等...我需要得到最后一列,比如 NF 用于 coumns,需要在 split 中使用一些东西。
  • 是的......

标签: awk


【解决方案1】:

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

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

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

GNU Awk 页面引用split() 函数

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

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

【讨论】:

  • 从来没有想过拆分也返回字段数。很好的帮助!
  • @PS.:很高兴它有帮助!
  • @Inian- 如果要求找到最后一列并且我们知道 FS。只是好奇知道我们为什么不只使用FS。 awk -F'[:,]' '{print $NF}' f
  • @VIPINKUMAR 在 OP 中:现在我不想要第 N 个字段,我需要提取第 N 个字段的 LAST 子字段
  • @JamesBrown - 刚刚尝试了几个示例并澄清了我的疑问,如果我们有多个具有不同子列计数的列,那么打印列号可能会产生错误的结果。
【解决方案2】:

您也可以使用revsdrawkcab,即。获得第一个:

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

我还是会像 @Inian 那样做。

【讨论】:

  • 有那么一瞬间,我以为你带来了一种新的空气结构,带有 sdrawkcab 拼写!不错的把戏!但除非需要,否则 Ed 讨厌使用 awk 的多种工具
【解决方案3】:

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

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

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

awk 版本(没有拆分)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多