Ich habe eine sehr große Datei (~ 400 GB) und muss die letzten 2 Zeilen entfernen. Ich habe versucht, zu verwenden sed
, aber es lief stundenlang, bevor ich aufgab. Gibt es eine schnelle Möglichkeit, dies zu tun, oder bleibe ich dabei sed
?
linux
sed
text-manipulation
Russ Bradberry
quelle
quelle
head -n -2 file
Antworten:
Ich habe dies bei einer großen Datei nicht versucht, um zu sehen, wie schnell es ist, aber es sollte ziemlich schnell sein.
So entfernen Sie mit dem Skript Zeilen am Ende einer Datei:
Es sucht bis zum Ende der Datei, prüft, ob das letzte Zeichen eine neue Zeile ist, liest dann jedes Zeichen einzeln rückwärts, bis drei neue Zeilen gefunden wurden, und schneidet die Datei unmittelbar nach diesem Punkt ab. Die Änderung wurde vorgenommen.
Bearbeiten: Ich habe eine Python 2.4-Version am unteren Rand hinzugefügt.
Hier ist eine Version für Python 2.5 / 2.6:
Hier ist eine Python 3-Version:
Hier ist eine Python 2.4-Version:
quelle
Sie können GNU Kopf versuchen
quelle
head: illegal line count -- -2
Ich sehe, dass meine Debian Squeeze / Testing-Systeme (aber nicht Lenny / stable) einen "Truncate" -Befehl als Teil des "Coreutils" -Pakets enthalten.
Damit könnte man einfach so etwas machen
um 160 Bytes vom Ende der Datei zu entfernen (offensichtlich müssen Sie genau herausfinden, wie viele Zeichen Sie entfernen müssen).
quelle
dd
Skript dies tun wird (Sie müssen den Eingabeversatz angeben, um zB das letzte Kilobyte zu erhalten und dann zu verwendentail -2 | LANG= wc -c
, oder so etwas).tail
ist auch für große Dateien effizient - kann verwendet werdentail | wc -c
, um die Anzahl der zu schneidenden Bytes zu berechnen.Das Problem bei sed ist, dass es sich um einen Stream-Editor handelt - er verarbeitet die gesamte Datei, auch wenn Sie erst gegen Ende Änderungen vornehmen möchten. Auf jeden Fall erstellen Sie zeilenweise eine neue 400-GB-Datei. Jeder Editor, der die gesamte Datei bearbeitet, wird wahrscheinlich dieses Problem haben.
Wenn Sie die Anzahl der Zeilen kennen, können Sie
head
diese verwenden. Dadurch wird jedoch eine neue Datei erstellt, anstatt die vorhandene zu ändern. Sie könnten Geschwindigkeitsgewinne durch die Einfachheit der Aktion erzielen, denke ich.Sie könnte mehr Glück mit
split
der Datei in kleinere Stücke zu brechen, die letzte Bearbeitung, und dann mitcat
wieder , sie zu kombinieren, aber ich bin nicht sicher , ob es nicht besser sein. Ich würde eher die Anzahl der Bytes als die Anzahl der Zeilen verwenden, sonst wird es wahrscheinlich gar nicht schneller - Sie werden immer noch eine neue 400-GB-Datei erstellen.quelle
Versuchen Sie es mit VIM ... Ich bin mir nicht sicher, ob es funktioniert oder nicht, da ich es noch nie für eine so große Datei verwendet habe, aber ich habe es in der Vergangenheit für kleinere, größere Dateien verwendet, probieren Sie es aus.
quelle
Welche Art von Datei und in welchem Format? Kann es einfacher sein, etwas wie Perl zu verwenden, abhängig davon, um welche Art von Datei es sich handelt - Text, Grafiken, Binärdateien? Wie ist es formatiert - CSV, TSV ...
quelle
Wenn Sie die Größe der Datei auf das Byte (400000000160 sagen) kennen und wissen, dass Sie genau 160 Zeichen entfernen müssen, um die letzten beiden Zeilen zu entfernen, dann ist so etwas wie
sollte den Trick machen. Es ist schon eine Ewigkeit her, dass ich dd im Zorn benutzt habe. Ich erinnere mich, dass die Dinge schneller gehen, wenn Sie einen größeren Block verwenden, aber ob Sie dies tun können, hängt davon ab, ob die Zeilen, die Sie löschen möchten, ein nettes Vielfaches haben.
dd verfügt über einige andere Optionen zum Auffüllen von Textdatensätzen mit einer festen Größe, die als vorläufiger Durchgang nützlich sein kann.
quelle
Wenn der Befehl "Truncate" auf Ihrem System nicht verfügbar ist (siehe meine andere Antwort), sehen Sie sich "Man 2 Truncate" für den Systemaufruf an, um eine Datei auf eine bestimmte Länge zu kürzen.
Natürlich müssen Sie wissen, auf wie viele Zeichen Sie die Datei kürzen müssen (Größe abzüglich der Länge der zwei Zeilen des Problems; vergessen Sie nicht, alle cr / lf-Zeichen zu zählen).
Erstellen Sie eine Sicherungskopie der Datei, bevor Sie dies versuchen!
quelle
Wenn Sie Lösungen im Unix-Stil bevorzugen, können Sie die Zeilen mithilfe von drei Codezeilen speichern und interaktiv abschneiden (Getestet auf Mac und Linux).
Small + Safe-Unix-Zeilenabbruch (Bestätigung erforderlich):
Diese Lösung basiert auf ein paar gängigen Unix-Tools, verwendet aber immer noch den
perl -e "truncate(file,length)"
nächstliegenden Ersatz fürtruncate(1)
, der nicht auf allen Systemen verfügbar ist.Sie können auch das folgende umfassende Programm für wiederverwendbare Shells verwenden, das Informationen zur Verwendung enthält und eine Bestätigung der Kürzung, Analyse von Optionen und Fehlerbehandlung bietet.
Umfassendes Skript zum Abschneiden von Zeilen :
Hier ist ein Anwendungsbeispiel:
quelle
Änderungen werden vorgenommen. Dies ist einfacher und effizienter als das Python-Skript.
quelle
ed
dauerte die Ausführung einer aus einer Million Zeilen und über 57 MB bestehenden Textdatei 100-mal so lange wie bei meinem Python-Skript. Ich kann mir nur vorstellen, wie viel mehr der Unterschied für die 7000-fach größere OP-Datei wäre.Die akzeptierte Antwort wurde geändert, um ein ähnliches Problem zu lösen. Könnte ein wenig optimiert werden, um n Zeilen zu entfernen.
Und der entsprechende Test:
quelle
Sie können Vim im Ex-Modus verwenden:
-,
wähle die letzten 2 Zeilen ausd
löschenx
speichern und schließenquelle