如何统计数据库表样本文本中词汇的出现次数及所在行数?
需求实现:统计词汇出现次数及所在行数
我们有一个包含数百万条记录的数据库表(source),提取到文本文件的样本数据如下:
denied the payment the payment successfull and incident reported successfull Incident is been reported
此前已通过以下命令完成词汇去重及总出现次数统计:
sed 's/ /\n/g' file|sort|uniq -c >> new.txt
输出结果为:
denied 1 the 2 payment 2 successfull 2 Incident 2 is 1 been 1 reported 2
现在需要在上述统计基础上,额外获取每个词汇所在的行数,期望输出格式如下:
values iterationcount countofrows denied 1 1 the 2 2 payment 2 2 successfull 2 1 (该词汇虽出现2次,但仅存在于1行中) Incident 2 2 is 1 1 been 1 1 reported 2 2
实现方案
直接用awk处理原始文本文件,可一次性完成词汇总出现次数、所在行数的统计,命令如下:
awk '{ for (i=1; i<=NF; i++) { word = $i count[word]++ rows[word][NR] = 1 } } END { printf "%-15s %15s %15s\n", "values", "iterationcount", "countofrows" print "" for (word in count) { row_count = length(rows[word]) printf "%-15s %15d %15d\n", word, count[word], row_count } }' file | sort
命令说明
- 遍历每行的每个词汇:
count[word]++:累计词汇的总出现次数rows[word][NR] = 1:用二维数组标记词汇所在的行号,同一行内重复的词汇只会被记录一次
- 处理结束后:
- 先打印规范的表头
- 通过
length(rows[word])获取词汇所在的总行数(二维数组的键为行号,长度即行数) - 最后用
sort对结果按词汇排序,和原有输出格式对齐
如果需要忽略大小写(比如把Incident和incident视为同一词汇),只需在word = $i后添加word = tolower(word)即可。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

