Regex 用awk替换字段中最后出现的字符
我试图用awk替换字段中最后出现的字符。给定的文件如下所示:Regex 用awk替换字段中最后出现的字符,regex,bash,awk,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 我尝试创建一个变量,该变量包含字段中空格的出现次数 {va
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参数不允许除数字和G/G之外的任何字符
我发现了一个类似的线程,但无法使解决方案适应我的问题
我是一个新手,所以任何帮助都将不胜感激 带有GNU awk的gensub():
获得阿诺德·罗宾斯的《有效的Awk编程》一书
非常好的书面问题顺便说一句 这里是一个简短的
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
将行反转,然后将第一个空格替换为
,
,然后再次反转。awk程序:{n=gsub(//,“”,$3);newv=n?gensub(/,“,”,n,$3):newv;print newv;}
应该可以正常工作。是什么让你相信它没有呢?awk版本可能存在的一个问题是,该行将通过分配给$NF来重新构造自身,这可能会影响具有多个空格的行。类似于John,Doe,Qr..s Uvw 6,Ghi
的内容将作为John,Doe,Qr.s Uvw,6,Ghi
输出,而不是John,Doe,Qr..s Uvw,6,Ghi
。(其中Qr
和s
之间的点是空格,否则会在注释中折叠,这有点讽刺)。当然,如果这不是输入的问题,那么最好避免只使用gensub和regexe!
rev file | sed 's/ /,/' | rev
John,Doe,Abc fgh,123,Abc
John,Doe,Ijk-nop,45D,Def
John,Doe,Qr s Uvw,6,Ghi