1.引言
从原始数据文件中获取各种类型的数据,将其去除报头后输出到根据数据类型命名的不同文件中。这一分拣和格式化数据的任务是很多数据分析处理的基本部分。实现这一任务可以选择多种可能的方式:用Awk、grep/sed/awk组合或者Perl来实现。
为了比较这三种实现方式的性能,我们选择了同样的数据进行测试,分别用三种方式编程,实现同样的功能,并且比较其运行时间性能。
我们使用的各种工具及操作系统版本如下:
grep (GNU grep) 2.5.1
sed GNU sed version 4.1.2
awk GNU Awk 3.1.3
Perl This is perl, v5.8.5 built for i386-linux-thread-multi
Linux version 2.6.9-42.ELsmp (bhcompile@hs20-bc1-1.build.redhat.com) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-2)) #1 SMP Wed Jul 12 23:27:17 EDT 2006
2.算法简介
三种方式中使用Awk和Perl编程是对所有文件进行一次扫描,grep/sed/awk是对文件进行多次扫描。
Awk方式使用其自带的字段切分功能,并且使用其系统函数gsub实现去报头功能。
grep/sed/awk方式用grep、sed和awk完成其擅长的任务,grep进行字符串搜索、sed进行文本替换,awk进行字段分割与输出。
Perl方式中,主要是使用split函数进行两此切割,一次对字段进行切割(TAB分割),一次对报头和数据进行切割,根据dt报头字段将相应数据输出到不同文件中。
3. 运行结果
时间 |
Awk |
grep/sed/Awk |
Perl |
运行结果 |
start...t=(16:37:19) END.t=(19:01:53) |
start...t=(21:13:56) END.t=(22:01:47) |
start...t=(11:34:01) END.t=(12:21:50) |
时间 |
144m34s |
47m51s |
47m49s |
4. 结论
对于对文本进行搜索,字段替换及切分字段后进行格式化输出的三种实现方式中:用gred/sed/awk组合与perl程序的运行时间几乎相同,而纯粹用AWK写的程序运行时间则大约是以上两种方式写的程序的3倍