You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:30:45