2014-09-24 2 views
0

Я обнаружил, что gawk реализован на C, и я использовал для написания программы C для обработки txt-файла, это стоило много времени в части ввода-вывода, и, возможно, есть и другие проблемы в моей программе на 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 слишком велика, чтобы на нее надеть, я просто опишу ее схему:

Я использую open() (fcntl.h), чтобы открыть исходный файл и перенаправить на него стандартный ввод, поэтому я использую функцию ввода, например scanf() или getchar(), чтобы прочитать файл в строке buf (i обрабатывать линию каждый раз). После этого я использую строчную функцию, такую ​​как strchr(), чтобы получить информацию, которую хочу, а затем помещаю в выходной файл

для этого случая программа c намного медленнее, чем awk, почему?

И вообще, как awk реализует эффективность, почему это так эффективно?

Любые парни имеют некоторое представление об этом, может быть, лучше взять пример.

PS: Я загружаю исходный код gawk, но мне трудно читать. Есть ли какие-то предложения?

спасибо :)

+4

Как мы можем сказать, не видя код C и Awk? –

+0

сейчас я показываю случай @larsmans –

+0

Я все еще могу только догадываться, но имейте в виду, что Awk и Gawk используют некоторые довольно умные регулярные выражения/конечные реализации автомата. Awk происходит из Bell Labs, где в то время работали Aho, Thompson и другие автоматы. –

ответ

1

Задайте вопрос в comp.lang.awk телеконференции, где он будет прочитан и отвечал на все эксперты и поставщики AWK, в том числе ребята, которые писали и поддержки простака ,

+1

@simon_xia, если вы не знакомы с usenet, вот ссылка: https://groups.google.com/forum/#!forum/comp.lang.awk –

+0

Я просто нашел его и нашел эту группу. Спасибо, в любом случае –

Смежные вопросы