如何用sed或awk合并带相同后缀标记的连续单词?
用Awk实现连续相同后缀单词的合并
嘿,刚接触sed和awk的话,这个需求用Awk来实现会更直观好懂,毕竟它天生擅长处理这种需要状态跟踪的文本逻辑。我给你一步步拆解思路和代码:
核心思路
我们需要逐词遍历每行内容:
- 记录上一个单词的后缀和已经拼接的单词内容
- 遇到和上一个后缀相同的单词,就把单词本体(去掉后缀)拼接到当前组里
- 遇到不同后缀的单词,先输出之前拼接好的组,再切换到新的后缀组继续处理
- 最后别忘了处理每行末尾的最后一组内容
具体Awk代码
awk '{ # 初始化变量:保存上一组的单词和后缀 prev_word = "" prev_suffix = "" # 遍历当前行的每个单词(NF是当前行的字段数) for (i=1; i<=NF; i++) { # 用/分割当前单词,拆分出单词本体和后缀 split($i, parts, "/") current_word = parts[1] current_suffix = "/" parts[2] if (current_suffix == prev_suffix) { # 后缀相同,拼接单词本体 prev_word = prev_word current_word } else { # 后缀不同,先输出之前的组(如果不是第一组的话) if (prev_word != "") { printf "%s%s ", prev_word, prev_suffix } # 更新为当前的单词和后缀 prev_word = current_word prev_suffix = current_suffix } } # 输出最后一组内容,换行 if (prev_word != "") { printf "%s%s\n", prev_word, prev_suffix } }' your_input_file.txt
代码解释
split($i, parts, "/"):把每个带后缀的单词(比如A/n)拆成parts[1] = "A"和parts[2] = "n"- 循环遍历每行的每个字段(单词),通过对比
current_suffix和prev_suffix来决定是拼接还是输出 printf用来控制输出格式,避免多余的空格
测试示例
假设你的输入行是:
A/n B/v C/n D/n E/w F/v G/v H/v
运行代码后输出会是:
A/n B/v CD/n E/w FGH/v
关于Sed的说明
Sed虽然也能处理文本,但它更擅长基于模式的替换,处理这种需要持续跟踪状态(比如记住上一个后缀)的逻辑会非常复杂,写出来的代码可读性很差,所以更推荐你用上面的Awk方案,新手更容易理解和调试~
内容的提问来源于stack exchange,提问作者Peng He
相关产品推荐
相关产品推荐

