之前的信息安全大赛有一道题叫bigdata,这道题给的文件中一共有5000多万个单词,需要找出文件中出现次数最多的单词和出现次数最少的单词。
500MB的TXT文件,感觉windows力不从心,于是想到了linux,linux强大的SHELL我相信能解决一切问题。
开始动手
打开文件后会发现,这个文件每行有若干个单词,单词之间用空格或者是tab隔开,但shell里sort和uniq都是一次处理一行字符串的,所以首先需要将该文件转换成一行一个单词的文件,我用的是tr命令。(可以用管道一次完成,但是为了清晰我一条一条分开讲)
因为在linux中tab和空格不一样,所以需要替换两次。假设文件名为text,命令如下:
cat text|tr " " "\n"|tr "\t" "\n"
这句命令的意思是,cat命令打开text文件,然后tr命令搜索空格,然后全部替换为回车;然后在替换完的文件中再搜索tab,然后将所有的tab替换成回车。
这样操作完后这个文件就变成一行一个单词的格式了,接下来我们来排序。
排序的思路就是先用sort按顺序排好,在用uniq去掉重复行,并且显示该行出现的次数,最后再用sort排一次序,最终输出需要的结果,命令如下:
cat text|tr " " "\n"|tr "\t" "\n"|sort|uniq -c|sort|tail -5
这句命令的意思是,先将空格和tab替换,就是上面所说的,然后用sort按字母顺序排序,然后用uniq命令去除重复的行,也就是重复的单词,并且显示每个单词出现的次数;然后再用sort排序,默认是按升序,如果要逆序后面加一个-r;排序后因为我不需要看到全部的结果,几万个单词全都显示会很慢而且屏幕显示不下,于是我加了tail -2。这句的意思是只显示结果中最后面的5行。如果需要最少出现的单词只需要改成head -5就行了,意思是显示结果中最前面的5行。
大致的思路和过程就是这样,当然还有很多种方法,个人认为shell命令较简单,于是就采用的这个方法。
如果有错误请大牛指出,谢谢~