为什么awk在效率方面表现良好

时间:2014-09-24 13:40:32

标签: performance awk gawk

我发现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的源代码,但我很难阅读。有什么建议吗?

非常感谢:)

1 个答案:

答案 0 :(得分:1)

在comp.lang.awk新闻组中提问,所有awk专家和提供者都会阅读并回复,包括编写和支持gawk的人员。