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 ZONE
HELLO HADOOP MY JOB
HELLO 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 1
B 1
C 1
HADOOP 3
HELLO 4
JOB 1
MY 3
WELCOME 1
WORLD 2
ZONE 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 4
HADOOP 3
MY 3
至于大文件运行效率如何,我觉得肯定是mapreduce更好。这个统计小文件应该还行。如果有不合理的地方,还请老鸟指正出来,谢谢。