Wenn ich eine reine Textdatei mit 8 Millionen Zeilen hätte und die Zeilen 4.000.010 bis 4.000.000 auf dem Bildschirm ausgeben möchte, was wäre effizienter: awk oder sed?
Der Text weist kein Muster auf und eine Datenbank ist leider keine Option. Ich weiß, dass das nicht ideal ist, bin aber neugierig, welche Methode die Aufgabe schneller erledigen würde.
Oder gibt es vielleicht sogar eine bessere Alternative zu sed oder awk?
Antwort1
Weder noch, verwenden Sie stattdessen tail
oder head
:
$ time tail -n 4000001 foo | head -n 11
real 0m0.039s
user 0m0.032s
sys 0m0.004s
$ time head -n 4000010 foo | tail -n 11
real 0m0.055s
user 0m0.064s
sys 0m0.036s
tail
ist tatsächlich durchweg schneller. Ich habe beide Befehle 100 Mal ausgeführt und ihren Durchschnitt berechnet:
Schwanz:
real 0.03962
user 0.02956
sys 0.01456
Kopf:
real 0.06284
user 0.07356
sys 0.07244
Ich stelle mir vor, tail
dass es schneller ist, weil es zwar bis zur Zeile 4e10 suchen muss, aber eigentlich nichts druckt, bis es dort ankommt, während es head
alles bis zur Zeile 4e10 + 10 druckt.
Vergleichen Sie mit einigen anderen Methoden, sortiert nach Zeitreihenfolge:
sed:
$ time sed -n 4000000,4000011p;q foo
real 0m0.312s
user 0m0.236s
sys 0m0.072s
Perl:
$ time perl -ne 'next if $.<4000000; print; exit if $.>=4000010' foo
real 0m1.000s
user 0m0.936s
sys 0m0.064s
awk:
$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo
real 0m0.955s
user 0m0.868s
sys 0m0.080s
Grundsätzlich gilt die Regel: Je weniger Sie analysieren, desto schneller sind Sie. Die Eingabe als Datenstrom zu behandeln, der nur auf dem Bildschirm gedruckt werden muss (wie dies der tail
Fall ist), ist immer der schnellste Weg.