------------------------------------------------------------

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) awk und noch was

Beitrag von rendegast » 24.05.2014 09:41:54

Meillo hat geschrieben: Teste doch nochmal mit `sort -u',
Guter Einwurf
$ time { sort -u zeilen | wc -l ; }
289

real 0m2.185s
user 0m3.496s
sys 0m0.224s
1sec weniger, immer noch langsamer als awk.
$ sort zeilen > zeilen_sort
$ time { sort -u zeilen_sort | wc -l ; }
289

real 0m0.954s
user 0m1.128s
sys 0m0.196s
<->
awk gibt sich keine Blöße:

Code: Alles auswählen

$ time { awk '!seen[$0]++' zeilen | wc -l ; }
289

real    0m1.381s
user    0m1.344s
sys     0m0.032s

$ time { awk '!seen[$0]++' zeilen_sort | wc -l ; }
289

real    0m1.294s
user    0m1.244s
sys     0m0.044s
Bleibt die (rhetorische) Frage, was kann ich! eher?
awk intensiver lernen (diese Abschweifung im Thread gehört ja dazu) und merken/nachvollziehen,
oder mir irgendwie mit 'sort -u > uniq-Liste' / '[egrep|fgrep] [-m1] -f uniq-Liste ursprungsdatei' behelfen?
(erste Versuche klappen gar nicht) ('egrep -f' ist seeeehr langsam, für 100 Zeilen Log sollte es aber ausreichen)
Zuletzt geändert von rendegast am 24.05.2014 12:07:23, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: (gelöst) awk und noch was

Beitrag von Meillo » 24.05.2014 10:40:00

rendegast hat geschrieben:
$ time { sort -u zeilen | wc -l ; }
289

real 0m2.185s
user 0m3.496s
sys 0m0.224s
1sec weniger, immer noch langsamer als awk.
Das war zu erwarten, denn sort kann nun alle mehrfachen Zeilen ignorieren, wodurch weniger Daten gespeichert werden mussen. Und der uniq-Schritt passiert schon beim Aufnehmen der Zeile. Im Vergleich zu awk ist `sort -u' langsamer, da halt immer noch sortiert wird.


Deine weiteren Messergebnisse entsprechen auch meinen Erwartungen: Bei den beiden sort-Varianten macht es einen Unterschied ob die Eingangsdaten schon sortiert sind oder nicht. Das laesst auf einen Sortieralgorithmus schliessen, der unterschiedliche Best-, Average- und Worst-Cases hat (wie Quicksort, der vermutlich verwendet wird). Beim awk-Ansatz macht es keinen Unterschied, da hierbei nicht sortiert wird. Damit ist die Reihenfolge der Eingangsdaten irrelevant.

Bleibt die (rhetorische) Frage, was kann ich! eher?
awk intensiver lernen (der Thread gehört ja dazu) und merken/nachvollziehen,
oder mir irgendwie mit 'sort -u > uniq-Liste' / 'grep -f uniq-Liste ursprungsdatei' behelfen?
('egrep -f' ist seeeehr langsam, für 100 Zeilen Log sollte es aber ausreichen).
Das Entweder-oder kann ich dir nicht beantworten; ich kann dich nur zum Sowohl-als-auch motivieren. ;-)

Awk wird viel zu sehr totgesagt (im Gegensatz zu sed, uebrigens). Ich sehe in awk aber eine Sprache mit einem enorm guten Preis-Leistungs-Verhaeltnis. (Man kann sie innerhalb eines Tages lernen wenn man C und sed schon kennt.) In dieser Hinsicht kann Perl IMO nicht mithalten, wenn das auch in anderen Gebieten seine Staerken hat. Ich finde awk auch deutlich einfach als die Shell, da es aus einem Guss ist, was man bei der Shell kaum vertreten kann. (Ohne mich darauf festlegen lassen zu wollen, weil man sowas ja doch nicht entscheiden kann, wuerde ich awk durchaus als meine Lieblingssprache bezeichnen.)
Use ed once in a while!

Antworten