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

    技术2022-07-11  71

    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

    Processed: 0.011, SQL: 9