题目标题:big data
题目描述:要吐就去wc,合并起来吐哦亲。
题目附件:http://pan.baidu.com/share/link?shareid=499174&uk=1562437020
看题目就知道是要用到很大的数据了,其实这道题说难不难,说简单也不简单。
首先下载题目的附件:bigdata.7z,有150.85M。
我用的是山猫系统,安装p7zip后用以下命令解压7z压缩包:
7za x bigdata.7z
下面是终端输出的解压信息:
Extracting 0/0/1/0/3/1/3/3/400 Extracting 0/0/2/0/2/2/5/6/401 Extracting 0/0/0/2/3/5/1/3/402 Extracting 0/1/0/0/3/4/3/3/403 Extracting 0/1/2/0/2/5/4/0/404 Extracting 0/0/0/0/0/3/5/1/405 Extracting 0/1/1/1/3/5/5/2/406 Extracting 0/0/2/1/3/5/6/7/407 Extracting 0/1/0/1/1/3/0/0/408 Extracting 0/1/0/0/0/4/1/6/409 Extracting myboyfriend.png ...... Folders: 46233 Files: 11 Size: 503091348 Compressed: 158023104
感觉很牛B的样子,150多M的压缩包解压后有500多M,包含了46233个文件夹和11个文件。
其中有一张名为myboyfriend.png的图片,还有10个文件,每个文件有50多M。
先打开图片看一下,居然是一张很猥琐的图:
看来题目的提示就是Python image steganography了。
Google一下关键字,点开第一个链接http://domnit.org/stepic/doc/。
看介绍说是python的图片隐写术,也就是把一些信息隐藏在图片里的技术。
按照官方教程先安装Stepic:
easy_install stepic
然后提取图片里的隐藏信息:
stepic --decode --image-in=myboyfriend.png --out=tips
执行后在目录下生成了一个tips文件,用MacVim打开文件,查看内容:
<tip>有10个体积较大的文本文件随机散落在文件夹0的子目录中,文件内容为英文单词,请统计出这10个文件中出现次数最多的单词和出现次数最少的单词还有他们对应的个数,连接起来就是key。例如:出现次数最多的单词为max,次数为100,出现次数最少的单词为min,次数为1,那么key为maxmin1001.</tip>
貌似是html编码,用浏览器打开tips,就能看到文字了:
有10个体积较大的文本文件随机散落在文件夹0的子目录中,文件内容为英文单词,请统计出这10个文件中出现次数最多的单词和出现次数最少的单词还有他们对应的个数,连接起来就是key。例如:出现次数最多的单词为max,次数为100,出现次数最少的单词为min,次数为1,那么key为maxmin1001.
好吧,看来要去wc吐了。
看一下前面的压缩包解压信息,10个文件就藏在这些文件夹里:
Extracting 0/0/1/0/3/1/3/3/400 Extracting 0/0/2/0/2/2/5/6/401 Extracting 0/0/0/2/3/5/1/3/402 Extracting 0/1/0/0/3/4/3/3/403 Extracting 0/1/2/0/2/5/4/0/404 Extracting 0/0/0/0/0/3/5/1/405 Extracting 0/1/1/1/3/5/5/2/406 Extracting 0/0/2/1/3/5/6/7/407 Extracting 0/1/0/1/1/3/0/0/408 Extracting 0/1/0/0/0/4/1/6/409
怎么把这些文件拼在一起呢?3条命令就搞定了:
# 进入名字为0的文件夹。 cd 0 # 搜索出当前目录下所有以"40"开头的文件,移动到0文件夹里。 mv $(find ./ -name 40*) ./ # 把0文件夹里这10个文件按顺序合并到bigdata文件里。 for i in {400..409};do cat $i >> bigdata;done
执行后生成了一个名为bigdata的文件,这样就成功把10个文本拼接起来了。
用MacVim打开bigdata,发现有2600多万行:
观察发现,每一行可能有多个单词,每个单词之间用制表符(\t)隔开。
下面是自动统计单词个数的pyhon代码:
#!/usr/bin/python # -*- coding : utf-8 -*- from collections import Counter if __name__ == "__main__": # 读取bigdata文件所有行 bigdata = open("bigdata") lines = bigdata.readlines() # 分割出每一行的单词放到words数组里面 words = [] for x in lines: words.extend(x.strip().split("\t")) # 统计出次数最多和最少的单词和次数 c = Counter(words) max = c.most_common(1)[0] min = c.most_common(len(c.keys()))[-1] print "key :%s%s%s%s"%(max[0], min[0], max[1], min[1])
在终端执行这个脚本,占用4G多内存,跑了60多秒,终于出现了答案:
2013/11/13 11:36:38
2013/09/01 21:13:49
2013/07/30 15:50:34
7za 命令行居然直接给出了路径,不科学
2013/07/30 15:58:16
哎哟,抓住一只信妈
2013/07/30 17:11:37
抓住一只洋葱
2013/07/30 15:48:57