【问题标题】:Replace last occurrence of a character in a field with awk用 awk 替换字段中最后一次出现的字符
【发布时间】:2015-04-23 07:41:29
【问题描述】:

我正在尝试用 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,但无法根据我的问题调整解决方案。

我对此很陌生,因此我们将不胜感激!

【问题讨论】:

  • awk 程序:{n=gsub(/ /," ",$3);newv=n?gensub(/ /,",",n,$3):newv;print newv;} 应该可以正常工作。是什么让你相信事实并非如此?

标签: regex bash awk


【解决方案1】:

使用 GNU awk 进行 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 的《Effective Awk Programming》一书。

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

【讨论】:

    【解决方案2】:

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

    因编辑评论而更新。

    或者您可以使用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 版本的一个可能问题是,该行将通过分配给 $NF 来重构自身,这可能会影响具有多个空格的行。像John,Doe,Qr.....s Uvw 6,Ghi 这样的东西会输出为John,Doe,Qr.s Uvw,6,Ghi 而不是John,Doe,Qr.....s Uvw,6,Ghi。 (Qrs 之间的点是空格,否则会在评论中折叠,有点讽刺)。当然,如果这不是输入的问题,那么避免 gawk-only gensub 和正则表达式是非常好的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2011-04-19
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多