Ich habe ein Problem beim Anzeigen von Teilen einer sehr großen Textdatei. Diese Datei, ungefähr 19 GB, ist offensichtlich zu groß, um mit herkömmlichen Mitteln angezeigt zu werden.
Ich habe versucht head 1
und tail 1
( head -n 1
und tail -n 1
) mit beiden Befehlen auf verschiedene Art und Weise (um zu einem Stück in der Mitte zu kommen) ohne Glück zusammengeschickt. Mein Linux-Rechner mit Ubuntu 9.10 kann diese Datei nicht verarbeiten.
Wie gehe ich mit dieser Datei um? Mein ultimatives Ziel ist es, die Linien 45000000 und 45000100 zu verbessern.
split
, die Arbeit mit der großen Datei zu vereinfachen.dd
, um das gewünschte Teil zu erhalten. Zum Beispieldd if=bigfile of=extractfile bs=1M skip=10240 count=5
werden 5 MB aus der Datei ab dem 10-GB-Punkt extrahiert.Antworten:
Sie sollten verwenden
sed
.Dies weist
sed
an, die Zeilen 45000000-45000100 einschließlich zu drucken und in Zeile 45000101 zu beenden.quelle
tail+|head
ist um gut 10-15% schneller.Erstellen Sie eine MySQL-Datenbank mit einer einzelnen Tabelle, die ein einzelnes Feld enthält. Importieren Sie dann Ihre Datei in die Datenbank. Dies macht es sehr einfach, eine bestimmte Zeile nachzuschlagen.
Ich glaube nicht, dass etwas anderes schneller sein könnte (wenn
head
undtail
schon scheitern). Am Ende muss die Anwendung, die eine Zeile finden möchte,n
die gesamte Datein
durchsuchen, bis neue Zeilen gefunden wurden. Ohne eine Suche (Zeilenindex zu Byte-Versatz in der Datei) kann keine bessere Leistung erzielt werden.Angesichts der Tatsache, wie einfach es ist, eine MySQL-Datenbank zu erstellen und Daten in diese zu importieren, halte ich dies für einen praktikablen Ansatz.
So geht's:
/tmp/my_large_file
wäre die Datei, die Sie lesen möchten.Die korrekte Syntax zum Importieren einer Datei mit durch Tabulatoren getrennten Werten in jeder Zeile lautet:
Ein weiterer großer Vorteil ist, dass Sie, wenn Sie später weitere Zeilen extrahieren möchten, nicht noch einmal stundenlang auf die Verarbeitung warten müssen (es sei denn, Sie löschen natürlich die Datenbank).
quelle
sed
Befehl arbeiten und identifizierte meine Zeilen. Jetzt habe ich jedoch eine weitere Frage, für die die Datenbankmethode möglicherweise besser geeignet ist. Ich muss jetzt ein paar hundert Zeilen aus der Datei löschen.sed
auch. Wenn Sie die Daten in der Datenbank hätten, wäre es natürlich trivial, eine neue Datei mit nur den gewünschten Zeilen zu exportieren.sed
Antwort angenommen (weil es mir sofort mehr Freude bereitet hat ;-)), habe Sie aber positiv bewertet, weil ich Ihre Methode in Zukunft anwenden werde. Ich schätze es.FIELDS TERMINATED BY '\n'
in dieLOAD DATA
Zeile einzufügen.Zwei gute alte Tools für große Dateien sind
join
undsplit
. Sie können die--lines=<number>
Option " Teilen mit " verwenden, um Dateien in mehrere Dateien einer bestimmten Größe zu schneiden.Zum Beispiel
split --lines=45000000 huge_file.txt
. Die resultierenden Teile wären in xa, xb usw. Dann können Siehead
den Teil xb , der die gewünschten Zeilen enthalten würde. Sie können Dateien auch wieder zu einer großen Datei zusammenfügen.quelle
Sie haben die richtigen Werkzeuge, verwenden sie aber falsch. Wie bereits bei U & L beantwortet , ist
tail -n +X file | head -n Y
(beachte das+
) 10-15% schneller alssed
bei Y-Linien, die bei X beginnen. Und bequemerweise müssen Sieexit
den Vorgang nicht explizit wie bei ausführensed
.quelle