我发现gawk是用C实现的,我曾经编写过一个C程序来处理txt文件,它在I / O部分花了很多时间,而且我的C程序可能还有其他一些问题。
该程序用于过滤文件中的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程序太大而无法放在这里,我只是描述它的大纲:
我使用open()(fcntl.h)打开原始文件并重定向标准输入,因此我使用输入func如scanf()或getchar()将文件读取到行buf(i进程)每次一行)。之后,我使用strchr()等字符串函数来获取我想要的信息,然后输入到输出文件
对于这种情况,c程序比awk慢得多,为什么?
总的来说,awk如何实现效率,为什么它如此高效?
任何人都对此有所了解,也许最好采取一些例子。
PS:我下载了gawk的源代码,但我很难阅读。有什么建议吗?
非常感谢:)
答案 0 :(得分:1)
在comp.lang.awk新闻组中提问,所有awk专家和提供者都会阅读并回复,包括编写和支持gawk的人员。