LeetCode地址:统计词频,bash
题目描述:
写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。
为了简单起见,你可以假设:words.txt只包括小写字母和 ' ' 。每个单词只由小写字母组成。单词间由一个或多个空格字符分隔。
示例:
假设 words.txt 内容如下:
the day is sunny the the
the sunny is is
你的脚本应当输出(以词频降序排列):
the 4
is 3
sunny 2
day 1
解题:
参考大神高斯恍惚的解题,地址这里。
cat words.txt |
awk '{
for(i=1;i<=NF;i++){
count[$i]++
}
} END {
for(k in count){
print k" "count[k]
}
}' |
sort -rnk 2
下面来解读下这个脚本中的关键内容:
cat:显示文件内容
|:管道,将左边的输出作为右边的输入
awk: 是一种处理文本文件的语言,是一个强大的文本分析工具。
AWK 工作流程可分为三个部分:
- 读输入文件之前执行的代码段(由BEGIN关键字标识)。
- 主循环执行输入文件的代码段。
- 读输入文件之后的代码段(由END关键字标识)。
例子:程序开始执行时,AWK 在开始块中输出表头信息。在主体块中,AWK 每读入一行就将读入的内容输出至标准输出流中,一直到整个文件被全部读入为止。
marks.txt中内容:
1) 张三 语文 80
2) 李四 数学 90
3) 王五 英语 87
$ awk 'BEGIN{printf "序号\t名字\t课程\t分数\n"} {print}' marks.txt
输出结果:
序号 名字 课程 分数
1) 张三 语文 80
2) 李四 数学 90
3) 王五 英语 87
count[$1] :将记录按指定的域分隔符划分域,填充域,$0 则表示所有域(即一行内容),$1 表示第一个域,$n 表示第 n 个域。所以脚本中从1开始,进行单词统计。
sort:用于将文本文件内容加以排序。
可针对文本文件的内容,以行为单位来排序。sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出。
语法
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
参数说明:
-n 依照数值的大小排序。
-r 以相反的顺序来排序。
-k:表示多字段排序,2表示以第二列为关键字进行排序。
其他:
- grep 适合单纯的查找或匹配文本
- sed 适合编辑匹配到的文本
- awk 适合格式化文本,对文本进行较复杂格式处理
1.awk用法例子:https://www.runoob.com/linux/linux-comm-awk.html
2.awk工作原理:https://www.runoob.com/w3cnote/awk-work-principle.html