数据分析和处理常用的linux命令

做数据分析或者是数据挖掘的,常常会有一种感觉,大概70-80%的时间都花在了对各种数据的预处理上,比如将数据格式化,比如从数据中提取某一部分,比如简单的一些统计。

“大数据”时代吗,似乎应该考虑使用Hadoop,用Hive,甚至Hbase。但很多时候,要处理的数据也没有那么大,可能就是几个G或者十几个G,要做的事情也很简单,为这点事写个脚本或者Hadoop程序不值当,而且未必快。

linux本身自带了很多好用的工具,适合完成这种简单的工作,下面列的都是我经常用的:

一般我们的数据文件都是类似下面这种的结构:
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
每一行有好几个data field,每个field之间有分隔符,比如这里的’:’

sort命令

这是一个太经常用到的命令,就是用它来做排序。sort命令的本质其实是外排(external sort)。所以无论多大的文件,它都能够搞定。我常用的参数:
-n sort默认是采用alphabetical order,用-n则采用numerical order
-o 设定排序后的文件名。如果我想在源文件上做sort,就必须得用-o
-r 倒序
-u 排序且排重
-k 指定针对哪个data field进行排序
例如:
sort -n -k 2,2 club_members -o club_members
就是对文件club_memebers,针对它的第2列进行数字的排序,然后再写回club_members。

Join命令

这是一个我非常爱用的命令,它的功能类似于Mysql中的join。它要求是两个文件都具有一个相同的data field,然后根据这个field可以做两个文件的交集,并集和补集,类似于Mysql的join的left join,right join和inner join。
特别需要说明的是,Join默认要求输入的两个文件在join的那个data field上是基于alphabetical order排序的。所以一般会先用sort命令处理这两个文件,再调用Join。
它的参数有很多。我常用的有:
-a 类似于实现left join的功能
-v 其实是获得一个补集
-t 用来设置文件的分割符
-o 表示输出哪个文件的哪几个data field
例如:
join -v 1 -t$’\t’ -o 1.1 1.2 1.3 2.2  -1 1 suserinfo -2 1 moreinfo
-1 1 表示suerinfo这个文件采用第一个data filed作为join的field;
-2 1 表示moreinfo这个文件也采用第一个data field作为join的field;
整个命令表示将文件1(suerinfo)中的第一列和文件2(moreinfo)中的第一列join起来,只选择在文件1存在而没有在文件2中存在的数据(-v 1),输出的格式是文件1的1,2,3列和文件2的2列(-o 1.1 1.2 1.3 2.2)
再说一句,这个命令真的好用。

comm命令

这个用来比较两个文件的异同,类似于求交集和补集。但是不一样的是,它就是简单的比较每一行,并不区分data fields。
参数:
-1     suppress lines unique to FILE1
-2     suppress lines unique to FILE2
-3     suppress lines that appear in both files
例如:
comm -12 file1.txt file2.txt
就是得到file1和file2的交集。

cut命令

顾名思义,对文件进行切割。这个切割是纵向的,意味着你可以从文件中提取出你要求的某几个data fields。
-d 用来设置文件的分割符
-f 指定data field
例如:
cut -f1,3 -d’:’ /etc/passwd
提取/etc/passwd文件中的第1个和第3个data field。

grep和sed

两个神一般强大的命令,都是以流的方式处理文本字符串。之所以把它们放在一起的另一个原因,是因为它们的强大都来源于正则表达式。所不同的是,grep用于过滤,筛选出满足某个正则表达式的内容;而sed常用于替换,即将满足正则的部分替换成另外一段字符串。
不说更多了,因为实在太强大,相关的细节太多。
不过要抱怨一下,TMD不同的语言正则的一些细节都不一样。linux shell, PHP和Java,我写过的三种正则都各有区别。也不知道这帮设计语言的人是怎么想的。

awk

大boss永远都是最后登场,所以awk一定排在最后。最强大的命令,也是流的方式处理文本,但是比之grep和sed又更加强悍。同样不多解释,因为不是一两句话说得清。

另外还有一些,例如split, paste等等,也都是简单又实用的命令工具。所以,一方面要掌握流行,学点hadoop;另一方面,其实很多旧的老玩意仍然很有用。

— END. —

Advertisements
相册 | 此条目发表在杂类分类目录。将固定链接加入收藏夹。

发表评论

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