Linux 命令实现单词计数功能

来源:互联网 发布:windows自带放大镜 编辑:程序博客网 时间:2024/06/06 08:45



hadoop 的 mapreduce 有个入门的程序叫wordcount,相当于其它程序语言的helloworld,是用来统计输入文本中用指定分隔符切割后得到的每个单词的出现次数。

现在来说明在Linux中如何实现这一功能


1. 获取文件每一行的每个单词

这里用awk命令来实现

awk -F(指定分隔符,默认空格或Tab) '{ for(i=1;i<=NF; i++){ print $i }}' filename

2. 将获得的每个单词进行排序

这里用到sort命令和管道


3. 然后进行去重操作

uniq -c 可以去重并显示出现的次数


例子: 我的文件是 hello.txt

.......$ cat hello.txt HELLO WORLD WELCOME MY ZONEHELLO HADOOP MY JOBHELLO HADOOP HADOOP WORLD MY ZONE HELLO A B C


用命令

awk '{ for(i=1;i<=NF; i++){ print $i }}' hello.txt | sort | uniq -c



结果

      1 A      1 B      1 C      3 HADOOP      4 HELLO      1 JOB      3 MY      1 WELCOME      2 WORLD      2 ZONE

这样就简单的实现了一个单词计数的功能。


如果想单词在前数字在后,可以再次使用awk命令

awk '{ for(i=1;i<=NF; i++){ print $i }}' hello.txt | sort | uniq -c | awk '{print $2,$1}'

结果

A 1B 1C 1HADOOP 3HELLO 4JOB 1MY 3WELCOME 1WORLD 2ZONE 2

当然如果想要输出美观,可以用awk的格式化输出 printf


现在我想统计一下单词出现最多的前三个该怎么办?当然就是按出现次数倒序sort,然后head -3

awk  '{for(i=1;i<=NF;i++){print $i}}' hello.txt | sort | uniq -c | awk '{print $2,$1}' | sort -t ' ' -k2nr  | head -3


结果

HELLO 4HADOOP 3MY 3


至于大文件运行效率如何,我觉得肯定是mapreduce更好。这个统计小文件应该还行。如果有不合理的地方,还请老鸟指正出来,谢谢。

0 0
原创粉丝点击