【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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值