CWYAlpha

Just another WordPress.com site

Thought this was cool: 一天一个shell实例(1)文本中n个出现频率最高的单词

leave a comment »


写一个文本处理程序,查找文本中n个出现频率最高的单词,输出的结果需要显示这些单词出现的次数,并按照次数从大到小排序。

把问题分成六个步骤:

1,将文本以一行一个单词的形式显示出来

2,将大写字母转换成小写

3,对单词进行排序

4,对排序好的单词列表统计每个单词出现的次数

5,按照出现的次数排序

6,显示单词列表的前n行

脚本的代码如下:

#topn.sh脚本

#!/bin/bash

end=$1     #1

cat $2 |      #2

tr cs [a-z][A-Z] [12*] |      #3

tr AZ a|      #4

sort |      #5

uniq |      #6

sort k1nr k2 |       #7

head n$end       #8

#1:$1为第一个参数,表示输出频率最高的行数

#2:$2为第二个参数,表示目标文本,使用cat把目标文本输入管道,|为管道符

#3:tr命令的-c选项用于选定不在”[a-z][A-Z]”字符集内的字符,tr命令将选定的字符转换成换行符,12是换行符的八进制码,*表示将换行符任意扩展,使其等于被替换的字符集个数,这样就将所有非字母的符号转换为换行符,从而将文本文件以一行一个单词的形式显示出来。-s删除所有重复出现的字符序列,只保留一个。最后把得到的结果输入管道。

#4:tr把大写字母转化成小写字母

#5:把分好的单词进行排序

#6:uniq对排序好的单词列表统计每个单词出现的次数,并删除相邻重复行,-c 在输出行前面加上每行在输入文件中出现的次数。 这样就得到了出现的频率及其对应的单词。

#7:用sort按照出现的频率从大大小排序,频率相同的按照字母排序。-k1表示按照第一域进行排序,-k2为按照第二域进行排序,先按照第一域排序如果第一域相等再按照第二域排序,-n表示数字,-r表示从大到小排序

#8:head 输出前n行

输出结果:

root@lNotebookPC:/home/lwx/myshelltest# ./topn.sh 5 test .txt
13 qwe
12 qw
11 eqw
8 sdf
7 we

C小加 2012-09-05 17:49 发表评论


from C++博客_Kevin Lynx: http://www.cppblog.com/cxiaojia/archive/2012/09/05/189585.html

Written by cwyalpha

九月 6, 2012 在 2:18 上午

发表在 Uncategorized

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: