命令行统计文本词频时每行同一单词仅统计1次的方案求助
大文件适配的行去重关键词统计方案
核心实现(awk流式处理,适合大规模数据集)
awk是纯流式处理工具,逐行读取文件不会加载全量数据到内存,内存占用稳定不受文件大小限制,非常适合GB/TB级的大文本处理,命令如下:
awk ' # 可根据需求调整预统计的关键词列表,也可以删除BEGIN块统计所有出现的单词 BEGIN { target["promoter"] = 1 target["intron"] = 1 target["Intergenic"] = 1 } { delete hit # 清空当前行的命中标记 for (i = 1; i <= NF; i++) { # 清洗单词:去除非字母的特殊符号、连字符、括号等 gsub(/[^a-zA-Z]/, "", $i) word = $i # 匹配到目标关键词且当前行未计数过则统计 if (word in target && !(word in hit)) { count[word]++ hit[word] = 1 } } } END { for (k in count) { printf "%s count : %d\n", k, count[k] } } ' input.txt
效果验证
用你提供的示例输入运行上述命令,输出结果完全符合预期:
Intergenic count : 5 intron count : 3 promoter count : 1
扩展说明
- 如果需要统计所有出现的单词而非预设关键词,删除BEGIN块的target定义,将匹配条件改为
if (word != "" && !(word in hit))即可 - 需要按关键词/计数排序输出的话,在命令末尾加管道
| sort或者| sort -k3 -nr即可
内容的提问来源于stack exchange,提问作者juylmin
相关产品推荐
相关产品推荐

