Was ist ein guter Weg, um beispielsweise Zeilen 20 bis 45 aus einer riesigen Textdatei zu extrahieren? Natürlich nicht interaktiv!
command-line
text-processing
Chris Huang-Leaver
quelle
quelle
awk NR==20,NR==45 textfile
funktioniert auch und liest sich leicht.,
Bereichsoperator von awk zu demonstrieren .Noch einfacher:
Das Flag -n deaktiviert die Standardausgabe. Die "20,45" adressiert die Zeilen 20 bis einschließlich 45. Der Befehl "p" druckt die aktuelle Zeile. Und das q wird nach dem Drucken der Zeile beendet.
quelle
q
Befehls (alles ab;
) verbesserte die Leistung für mich beim Extrahieren einer einzelnen Zeile 26995107 aus einer Datei mit 27169334 Zeilen.Dies ist keine Antwort, kann aber nicht als Kommentar veröffentlicht werden.
Ein anderer (sehr schneller) Weg, dies zu tun, wurde von mikeserv hier vorgeschlagen :
Unter Verwendung der gleichen Testdatei wie hier und des gleichen Verfahrens finden Sie hier einige Benchmarks (Extrahieren der Zeilen 1000020-1000045):
mikeserv :
Stefan :
Dies sind bei weitem die schnellsten Lösungen und die Unterschiede sind vernachlässigbar (für einen einzelnen Durchgang) (ich habe es mit verschiedenen Bereichen versucht: ein paar Zeilen, Millionen von Zeilen usw.).
Ein Verzicht auf das Rohr kann jedoch einen erheblichen Vorteil für eine Anwendung bieten, die auf ähnliche Weise über mehrere Linienbereiche hinweg suchen muss , z.
... was druckt ...
... und liest die Datei nur einmal durch.
Die anderen
sed
/awk
/perl
Lösungen lesen Sie die gesamte Datei und da diese über große Dateien ist, sie sind nicht sehr effizient. Ich warf in einigen Alternativen dassexit
oderq
uit nach der letzten Zeile im angegebenen Bereich:Stefan :
vs.
dkagedal (
sed
):vs.
Steven D :
vs.
quelle
awk NR==1000020,NR==1000045 textfile
in Ihrem System kostet.quelle
python -c 'import fileinput, sys; [sys.stdout.write(line) for nr, line in enumerate(fileinput.input()) if 19 <= nr <= 44]'
auch, wenn wir schon dabei sind ? :-P Dies ist etwas, was Ruby, nach dem Vorbild von Perl, inspiriert von awk / sed, leicht tun kann.Da sed und awk bereits eingenommen wurden, ist hier eine Perl-Lösung:
Oder, wie in den Kommentaren ausgeführt:
quelle
perl -ne'print if 20..45' textfile