在Shell环境中,统计文本中单词出现频率有多种实现方式。以下是几种常见且实用的方法,适用于不同场景下的词频分析需求。
1. 利用 tr、sort 和 uniq 组合处理
这是基础但有效的词频统计方案:
cat file.txt | tr '[:space:]' '\n' | tr '[:upper:]' '[:lower:]' | grep -v '^$' | sort | uniq -c | sort -nr
各步骤说明如下:
- tr '[:space:]' '\n':将所有空白字符(如空格、制表符、换行)替换为换行符,使每个单词独立成行。
- tr '[:upper:]' '[:lower:]':将大写字母转换为小写,实现不区分大小写的统计。
- grep -v '^$':过滤掉空行,避免干扰统计结果。
- sort:对单词进行排序,为后续去重计数做准备。
- uniq -c:统计相邻重复行的出现次数,即每个单词的频次。
- sort -nr:按数值逆序排列,高频词优先显示。
tr
sort
uniq
2. 使用 awk 进行高效统计
awk 能在一个流程中完成遍历与计数,性能更优:
awk '{
for (i=1; i<=NF; i++) {
word = tolower($i)
freq[word]++
}
}
END {
for (word in freq) {
printf "%d %s\n", freq[word], word
}
}' file.txt | sort -nr
该方法通过数组 freq 直接记录每个单词的出现次数,最后输出并按频次降序排列。
awk
3. 增强版:去除标点符号后再统计
若原始文本包含标点,可先清理再处理:
cat file.txt | tr -s '[:punct:][:space:]' '\n' | tr '[:upper:]' '[:lower:]' | grep -v '^$' | sort | uniq -c | sort -nr
其中 tr -s 可压缩连续的标点和空白字符为单个换行,有效分离单词。
4. 统计特定单词的出现次数
若只需查询某个词(如 "the")的频次,可用以下命令:
grep -o -i '\bthe\b' file.txt | wc -l
这里 -o 表示仅输出匹配部分,-i 忽略大小写,\b 确保匹配完整单词,防止误匹配如 "there" 中的 "the"。
5. 使用 sed 预处理文本
借助 sed 清理非字母数字字符后再进行统计:
cat file.txt | sed 's/[^a-zA-Z0-9 ]//g' | tr '[:space:]' '\n' | tr '[:upper:]' '[:lower:]' | grep -v '^$' | sort | uniq -c | sort -nr
此方式能保留字母、数字和空格,去除其余符号,适合需要保留数字词汇的场景。
sed
注意事项与优化建议
- 上述方法默认以空白分割单词,若需复杂分词逻辑(如中文或连字符处理),建议使用专业工具。
- 对于大型文件,awk 实现方式通常比多级管道更具效率,减少I/O开销。
- 如需区分大小写,可省略
tr '[:upper:]' '[:lower:]'步骤。 - 若输入格式复杂,可结合正则表达式增强清洗能力。
perl
python
awk
tr '[:upper:]' '[:lower:]'
输出格式说明
最终输出一般为两列结构:
15 the
12 and
10 is
...
第一列为词频数值,第二列为对应单词,便于阅读或进一步处理。
42 the
35 and
28 to
...
根据实际需求选择合适的方法,并可在此基础上灵活调整参数与流程。


雷达卡


京公网安备 11010802022788号







