如何使用awk移除单词末尾的ing、ed、s后缀实现词形还原?
awk指定列移除后缀实现词形还原方案
原代码错误原因
- 正则语法错误:对分组括号添加了不必要的转义符
\,导致逻辑上的分组变成了匹配字面括号,只会匹配(ing)、(ed)、(s)这类带括号的字符串,无法匹配单词后缀 - 后缀匹配顺序错误:未按后缀长度从长到短匹配,短后缀
s会优先匹配ing末尾的s,导致长后缀无法被正确识别移除 - 替换值错误:将后缀替换为空格而非空字符串,会在单词中间产生多余空格
- 无输出分隔符配置:修改列内容后会导致原制表符分隔格式被替换为空格,破坏原文件结构
可用实现代码
演示场景(处理第二列$2)
awk -F'\t' 'BEGIN{OFS=FS} { # 先匹配长后缀,再匹配短后缀避免匹配冲突 gsub(/(ing|ed)\b/, "", $2) gsub(/s\b/, "", $2) print }' file.txt
实际生产场景(处理第14列$14)
仅需将上述代码中的$2替换为$14即可。
代码说明
BEGIN{OFS=FS}:指定输出分隔符和输入分隔符一致,保留原文件的制表符分隔格式- 分两次做全局替换:先移除3位后缀
ing和2位后缀ed,再移除1位后缀s,完全避免短后缀优先匹配的问题 \b匹配单词边界,确保仅移除单词末尾的后缀,不会误删单词中间的对应字符- 替换值为空字符串
"",直接移除后缀不会产生多余空格
输出验证
运行上述代码处理你提供的演示数据集,输出结果和期望结果完全匹配:
onething Thi i a str that i test multiple time. twoed I want to remove word end with many pattern. threes Read book i good th.
内容的提问来源于stack exchange,提问作者Nhung Luong
相关产品推荐
相关产品推荐

