【LeetCode】bash统计词频率——awk、sort

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

3.sort用法:https://www.runoob.com/linux/linux-comm-sort.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章