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倍