awk匹配词编号异常修复及多关键词全匹配扩展方案咨询
问题根因
你原来的命令执行异常有两个核心原因:
- awk的
gsub()函数的替换字符串会预先完成变量/表达式求值,再对所有匹配项执行统一替换,并不是每匹配到一个目标词就动态计算一次替换内容,同一行的所有匹配项会共用同一个计数器值,计数逻辑完全不符合预期 - 你用
a["&"]作为计数键,这里的"&"是字面量字符串,不是匹配到的关键词本身,后续扩展多关键词时也无法区分不同词的计数
单关键词修复方案
可直接实现8个better按出现顺序从1到8编号,同时支持完整单词匹配避免命中子串:
python -c 'import this' | awk -v t="better" ' { pos = 1 while(match($0, "\\<" t "\\>", arr, pos)) { cnt[t]++ $0 = substr($0,1,RSTART-1) "[" arr[0] "-" cnt[t] "]" substr($0,RSTART+RLENGTH) pos = RSTART + RLENGTH } print }'
多关键词扩展方案
完全满足从match.txt读取关键词、完整单词匹配、仅单次扫描输入的需求:
- 先将待匹配关键词每行一个存入
match.txt,示例内容如下:
better explicit simple
- 执行对应awk命令:
python -c 'import this' | awk ' # 第一步读取所有待匹配关键词 NR == FNR { keywords[$0] = 1 next } # 第二步处理输入文本 { pos = 1 while(match($0, /\<[a-zA-Z]+\>/, arr, pos)) { cur_word = arr[0] if (cur_word in keywords) { cnt[cur_word]++ $0 = substr($0,1,RSTART-1) "[" cur_word "-" cnt[cur_word] "]" substr($0,RSTART+RLENGTH) } pos = RSTART + RLENGTH } print }' match.txt -
方案特性:
- 不同关键词独立计数,增删匹配词仅需修改
match.txt无需调整命令逻辑 - 自动识别单词边界,不会把子串当成匹配项(比如不会匹配
betterness中的better) - 仅对输入文本做一次扫描,处理效率更高
内容的提问来源于stack exchange,提问作者stack0114106
相关产品推荐
相关产品推荐

