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

如何遍历文本统计相邻词对出现次数,解决shell脚本死循环问题

问题排查

你编写的代码存在以下几处核心问题:

  • 输入流向错误:管道的输出仅传递给了第一个read word1命令,后续的while循环没有绑定输入源,会持续等待标准输入,表现为类似无限循环的卡住状态
  • 变量赋值错误:循环内word1=word2未添加变量取值符$,实际是把字符串word2赋值给了word1,而非读取word2的变量值
  • 子Shell作用域问题:Bash中管道后的命令默认在子Shell中执行,即使调整输入流向,第一个read word1拿到的变量也无法传递到管道外的while循环使用
  • 缺少异常处理:sed直接替换空格为换行时,如果文本存在连续空格、首尾空格,会生成空行,导致统计到无效词对
  • 缺少统计逻辑:原代码仅输出词对,没有实现出现次数统计的功能
解决方案

方案1:Shell原生实现

适合小文件场景,逻辑清晰易理解:

# 读取所有非空单词到数组,规避子Shell问题
words=($(sed 's/[[:space:]]\+/\n/g' "$1" | grep -v '^$'))
# 遍历生成相邻词对并统计次数
for ((i=0; i<${#words[@]}-1; i++)); do
    echo "${words[i]} ${words[i+1]}"
done | sort | uniq -c

方案2:Awk实现(推荐)

性能更高,适合大文件,自动处理多空格、换行等异常格式:

awk '{
    for(i=1; i<NF; i++) {
        cnt[$i" "$(i+1)]++
    }
} END {
    for(pair in cnt) {
        print cnt[pair], pair
    }
}' "$1"

两种方案输入I am a man测试,都可以输出你期望的结果。

内容的提问来源于stack exchange,提问作者ACCazacu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:06:03