我發現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的源代碼,但是我很難讀。有一些建議嗎?
感謝很多:)
我們如何看不到C和Awk代碼? – 2014-09-24 13:43:45
現在我展示案例@larsmans – 2014-09-24 14:02:51
我仍然只能猜測,但請注意Awk和Gawk使用一些非常智能的正則表達式/有限自動機實現。 Awk最初來自貝爾實驗室,當時Aho,Thompson和其他自動機械大師正在工作。 – 2014-09-24 20:13:47