如何在AWK中使用匹配反向引用检测并去除重复双字母?
问题原因
gensub是GNU AWK(gawk)独有的扩展函数,非GNU版本的AWK(如macOS系统自带的BSD AWK)不支持该函数,运行后会无效果。- 正则写法的转义规则错误,同时要注意
gensub不会修改输入的原字符串,必须显式使用它的返回值。
正确实现方案
先确认你使用的是GNU AWK,可执行awk --version查看版本信息,若没有GNU标识,需安装gawk后使用gawk命令执行脚本。
可直接运行的测试命令
gawk 'BEGIN {f="telly" ;print gensub(/(.)\1/,"\\1","g",f)}' # 输出:tely
测试connoisseur的效果:
gawk 'BEGIN {f="connoisseur" ;print gensub(/(.)\1/,"\\1","g",f)}' # 输出:conoiseur,重复的n、s均已去重
适配你的业务脚本的写法
你的disambiguate函数需要按如下方式实现,确保正确返回处理后的字符串:
function disambiguate(str) { # 正则用字面量写法,无需额外转义,直接返回gensub的处理结果 return gensub(/(.)\1/, "\\1", "g", str) } BEGIN {FS= "\"" } {print $2,$4,disambiguate($4),isolate_terminal_vowels($4),devowelCentre(isolate_terminal_vowels($4)),$6}
特殊场景说明
如果你需要用动态拼接的正则(而非固定正则字面量),需要对反斜杠做二次转义,写法如下:
function disambiguate(str) { # 字符串形式的正则需要四层反斜杠才能匹配到反向引用 return gensub("(.)\\\\1", "\\1", "g", str) }
内容的提问来源于stack exchange,提问作者Tobe
相关产品推荐
相关产品推荐

