文学世界

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2334|回复: 1

[shell] 统计词频

[复制链接]

452

主题

165

回帖

2784

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2784
发表于 2023-3-27 12:22:42 | 显示全部楼层 |阅读模式
写一个 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

说明:不要担心词频相同的单词的排序问题,每个单词出现的频率都是唯一的。

你可以使用一行 Unix pipes 实现吗?

02



解题思路分析

1、xargs

# xargs 分割字符串 -n 1表示每行输出一个# uniq -c 统计重复次数# sort -r 降序排序 -n 以数字排序(默认字符)

2、tr
cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -nr | awk '{print $2" "$1}'

回复

使用道具 举报

452

主题

165

回帖

2784

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2784
 楼主| 发表于 2023-3-27 12:34:47 | 显示全部楼层
cat 命令用于连接文件并将内容输出到标准输出设备上。
tr(translate的缩写)主要用于字符的删除与替换
语法:tr[-c/d/s/t] [SET1] [SET2]
参数:-c:(complement)用SET2中的字符替换SET1中没出现的字符
     -d:(delete)删除SET1中的所有字符
     -s:(sequence repreat)压缩SET1中重复的字符,使其只出现一次
     -t:将SET1转换为SET2(为缺省状态)

sort [选项]... [文件]...
串联排序全部指定文件并将结果写到标准输出。spa

排序选项:blog

-b, --ignore-leading-blanks 忽略前导的空白区域
-d, --dictionary-order 只考虑空白区域和字母字符
-f, --ignore-case 忽略字母大小写
-g, --general-numeric-sort 按照常规数值排序
-i, --ignore-nonprinting 只排序可打印字符
-n, --numeric-sort 根据字符串数值比较
-r, --reverse 逆序输出排序结果排序

其余选项:字符串

-c, --check, --check=diagnose-first 检查输入是否已排序,若已有序则不进行操做
-k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)
-m, --merge 合并已排序的文件,再也不进行排序
-o, --output=文件 将结果写入到文件而非标准输出
-t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换
-u, --unique 配合-c,严格校验排序;不配合-c,则只输出一次排序结果io



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|文学世界

GMT+8, 2024-12-5 10:20 , Processed in 0.100128 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表