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