awk - zjisteni cetnosti vzorku v souboru
Pavel Kankovsky
peak na argo.troja.mff.cuni.cz
Čtvrtek Září 19 22:23:47 CEST 2002
On Thu, 19 Sep 2002, Pavel Janík wrote:
> > Hm, ze by takto:
> > awk '/..:../{pole[$1]++}END{for(i in pole)printf"%s %d\n",i,pole[i]}'
> > log.txt
> >
> > Budu se nekdy mset naucit perl, v tom to pujde urcite uzasne
> > zoptimalizovat. :-)
>
> tak tohle by mne celkem zajímalo. Můj odhad je, že perl bude mírně až
> výrazně pomalejší... ;-) Můžete to někdo vyzkoušet a reportovat sem
> výsledky?
Pri vsi ucte k Perlu...spis vyrazne.
maly vstup 10x vetsi vstup
awk1: 2,5s 33s
awk2: 4,6s 50s
awk3: 3,9s 43s
perl1: 15,5s 165s
perl2: 16,8s 166s
perl3: 5,9s 55s
Awk1: puvodni program
Awk2: malinko upraveny, aby jako klic pouzival $3 (vetsi pocet ruznych
hodnot v mych testovacich datech)
Awk3: Awk2, vynechano testovani reg. vyrazu
Perl1: naivni preklad
while (<>) {
if (/..:../) {
@a = split;
$pole{$a[0]}++
}
}
for $a(keys(%pole)) {
printf("%s %d\n", $a, $pole{$a});
}
Perl2: nahrazeni $a[0] a $a[2] (ekvivalent awk1->awk2)
Perl3: testovani reg. vyrazu & split odstraneno, pouzito substr(),
dale odstraneno while (<>) a nahrazeno -n
$pole{substr($_,7,8)}++;
END {
for $a(sort(keys(%pole))) {
printf("%s %d\n", $a, $pole{$a});
}
}
Nicmene je videt, ze implementace asociativnich poli v awku je zjevne
slabsi a pri zvetsovani poctu klicu rychle ztraci dech v porovnani
s Perlem.
Krome toho je treba souhlasit s kolegou Dobesem: implementaci v Perlu
skutecne lze dost zoptimalizovat: pomer 3:1 mezi prvni a posledni
variantou neni k zahozeni. (Sveho casu jsem jeden perlovy program
vhodnym uzitim operatoru s a y misto smycky, co zpracovavala
jednotlive znaky, urychlil asi 15-krat.)
--Pavel Kankovsky aka Peak
"Welcome to the Czech Republic. Bring your own lifeboats."
Další informace o konferenci Linux