Effiziente Möglichkeit, Zeilen aus einer großen Datei mit awk, sed oder etwas anderem auszudrucken?

Effiziente Möglichkeit, Zeilen aus einer großen Datei mit awk, sed oder etwas anderem auszudrucken?

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 tailoder 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

tailist 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, taildass es schneller ist, weil es zwar bis zur Zeile 4e10 suchen muss, aber eigentlich nichts druckt, bis es dort ankommt, während es headalles 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 tailFall ist), ist immer der schnellste Weg.

verwandte Informationen