2014-09-24 34 views
0

我發現gawk是用C語言實現的,我用它來編寫一個C程序來處理txt文件,它在I/O部分花費很多時間,也許還有一些其他問題在我的C程序中。awk爲什麼在效率上表現不錯

該方案是從文件篩選器的IP地址,每行的格式是

T 218.241.107.98 117.44.215.39 7 2719 1378472723 N 0 0 0 G 0 I   218.241.107.97,0.130,1 218.241.98.45,0.265,1 192.168.1.253,0.181,1 159.226.253.77,0.218,1 159.226.253.46,4.367,1 219.142.17.37,1.062,1 118.84.3.5,2.976,1 202.97.34.134,29.026,1 

過程後,每一行的格式應該喜歡這個

218.241.107.98 117.44.215.39 218.241.107.97 218.241.98.45 192.168.1.253 159.226.253.77 159.226.253.46 219.142.17.37 118.84.3.5 202.97.34.134 

我寫的awk如下

#!/usr/bin/awk -f 
BEGIN { 
    FS = "[, \t]" 
} 
{ 
    for(i = 1; i <= NF; i++) 
    { 
    if ($1 == "#") 
     continue 
    if ($i ~ /((([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5]))/) 
     printf $i"\t" 
    if (i == NF) 
     printf "\n" 
    } 
} 

C程序太大而無法放在這裏,我只是描述它的大綱:012我使用open()(fcntl.h)來打開原始文件並重定向標準輸入,所以我使用scanf()或getchar()等輸入函數來讀取文件到一行buf(i每次處理一條線)。之後,我使用strchr()等字符串函數來獲取我想要的信息,然後把輸出文件

對於這種情況,c程序比awk慢得多,爲什麼?

一般來說,awk如何實現效率,爲什麼它如此高效?

任何人都有一些想法,也許最好舉個例子。

PS:我下載了gawk的源代碼,但是我很難讀。有一些建議嗎?

感謝很多:)

+4

我們如何看不到C和Awk代碼? – 2014-09-24 13:43:45

+0

現在我展示案例@larsmans – 2014-09-24 14:02:51

+0

我仍然只能猜測,但請注意Awk和Gawk使用一些非常智能的正則表達式/有限自動機實現。 Awk最初來自貝爾實驗室,當時Aho,Thompson和其他自動機械大師正在工作。 – 2014-09-24 20:13:47

回答

1

請在comp.lang.awk新聞組在那裏將被讀取並通過所有awk的專家和供應商,包括是誰寫的傢伙和支持的gawk回答問題。

+1

@simon_xia,如果您不熟悉usenet,請點擊以下鏈接:https://groups.google.com/forum/#!forum/comp.lang.awk – 2014-09-24 17:24:22

+0

我只是谷歌它,發現該組。不管怎麼說,還是要謝謝你 – 2014-09-25 00:40:09

相關問題