用 awk 替换字段中最后一次出现的字符

Replace last occurrence of a character in a field with awk

我正在尝试用 awk 替换字段中最后一次出现的字符。给出的是这样一个文件:

John,Doe,Abc fgh 123,Abc
John,Doe,Ijk-nop 45D,Def
John,Doe,Qr s Uvw 6,Ghi

我想用逗号“,”替换最后一个 space“”,基本上将字段一分为二。结果应该如下所示:

John,Doe,Abc fgh,123,Abc
John,Doe,Ijk-nop,45D,Def
John,Doe,Qr s Uvw,6,Ghi

我尝试创建一个变量,其中包含 space 在

字段中出现的次数
{var1=gsub(/ /,"",)}

然后整合到

{var2=gensub(/ /,",",var1,); print var2}

但是 gensub 中的 how-argument 不允许除数字和 G/g.

之外的任何字符

我找到了一个类似的线程 here 但无法针对我的问题调整解决方案。

我对此还很陌生,如有任何帮助,我们将不胜感激!

使用 GNU awk for gensub():

$ awk 'BEGIN{FS=OFS=","} {=gensub(/(.*) /,"\1,","",)}1' file
John,Doe,Abc fgh,123,Abc
John,Doe,Ijk-nop,45D,Def
John,Doe,Qr s Uvw,6,Ghi

获取 Arnold Robbins 的 Effective Awk Programming 一书。

问题写得很好!

这里是短片awk

awk '{$NF=RS$NF;sub(" "RS,",")}1' file
John,Doe,Abc fgh,123,Abc
John,Doe,Ijk-nop,45D,Def
John,Doe,Qr s Uvw,6,Ghi

根据 Eds 评论更新。

或者您可以使用 rev 工具。

rev file | sed 's/ /,/' | rev
John,Doe,Abc fgh,123,Abc
John,Doe,Ijk-nop,45D,Def
John,Doe,Qr s Uvw,6,Ghi

反转行,然后将第一个 space 替换为 ,,然后再次反转。