awk统计词频需配合sort和uniq:先用awk按空格拆词并逐行输出,再用sort归类、uniq -c计数、sort -nr倒序排列。

用 awk 统计词频并排序,核心思路是:把文本拆成单词 → 每个单词计一次数 → 按频次倒序排列。整个过程通常配合 sort 和 uniq 完成,awk 主要负责“拆词”和“预处理”,不是单独完成全部统计。
按空格分词并统计(最常用场景)
适用于纯英文文本,单词由空格分隔,无标点干扰:
- 先用
awk把每行按空格切开,逐个输出每个单词(一行一个) - 再用
sort把相同单词归到一起 - 接着用
uniq -c统计重复次数 - 最后用
sort -nr按数字倒序排(-n表示按数值,-r表示逆序)
完整命令:
cat words.txt | awk '{for(i=1;i输出形如:
15 the
12 and
9 of
第一列是频次,第二列是单词。
处理带标点的文本(更贴近实际)
真实文本常含逗号、句号、引号等,直接按空格分词会把 hello, 和 hello 当作两个词。解决办法是先清洗标点:
- 用
tr把所有非字母字符(包括换行)替换成换行符,再删空行 - 或用
awk+ 正则提取连续字母段
推荐写法:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
其中 tr -cs '[:alpha:]' '\n' 表示:保留所有字母,其余字符全转为换行符;grep -v '^$' 过滤掉空行。
用 awk 自带数组统计(不依赖 sort/uniq)
如果想纯 awk 实现(比如处理超大文件避免多次管道),可用关联数组计数:
awk '{for(i=1;i说明:
-
count[$i]++对每个单词自动累加次数 -
END块在读完全部内容后遍历数组输出 - 注意:
for (w in count)遍历顺序不确定,所以末尾仍需sort -nr排序
只统计满足条件的单词(如全小写、长度≥3)
过滤可放在 awk 内部,提升效率:
awk '{for(i=1;i正则 ^[a-z]{3,}$ 确保单词全小写、至少 3 个字母,排除 Alice、it、123 等。










