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

时间:2015-02-21 17:51:08

标签: regex bash awk

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

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

我想用逗号“,”替换最后一个空格“”,基本上将字段分成两个。结果应该是这样的:

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

我尝试使用

创建一个变量,其中包含字段中出现的空格数
{var1=gsub(/ /,"",$3)}

然后将其集成到

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

但是gensub中的how-argument不允许除数字和G / g之外的任何字符。

我找到了一个类似的帖子here但是无法使解决方案适应我的问题。

我对此很新,所以任何帮助都会受到赞赏!

2 个答案:

答案 0 :(得分:3)

使用GNU awk for gensub():

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

获取Arnold Robbins的有效Awk编程一书。

写得很好的问题顺便说一句!

答案 1 :(得分:1)

这是一个简短的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

反转该行,然后用,替换第一个空格,然后再次反转。