GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Effizient die ersten paar Zeilen aus einer Textdatei entfernen?

  • head /tail fast die gesamte Datei durchlaufen müssen (abhängig von der Position der Zeile, die Sie als Parameter angeben).
    Dann kopieren Sie das Ergebnis in eine neue Datei und löschen die alte.

  • Ich bin mir nicht sicher, ob sed wird die gesamte Datei iterieren, aber Sie müssen dieses Ergebnis in eine neue Datei kopieren und die alte löschen. Auch mit -i (an Ort und Stelle) erstellt es eine temporäre Datei unter der Haube, also gilt dasselbe.

Warum bewegen Sie nicht einfach den Zeiger, der auf die erste Zeile der Datei zeigt, und verschieben ihn in die gewünschte Zeile?

Wie konnten wir so etwas tun? Muss ich in C tun? Gibt es einen anderen Weg?

Ist das sinnvoll ?? Ich denke falsch? Wenn ja, warum?

Akzeptierte Antwort:

Warum bewegen Sie nicht einfach den Zeiger, der auf die erste Zeile der Datei zeigt, und verschieben ihn in die gewünschte Zeile?

Denn es gibt keinen „Zeiger, der auf die erste Zeile der Datei zeigt“.

Die grundlegenden Operationen zum Ändern einer Datei sind:Überschreiben einer Reihe von Bytes (d. h. Ersetzen eines Teils durch Daten derselben Länge), Anhängen (d. h. am Ende hinzufügen), Abschneiden (d. h. am Ende entfernen).

Die meisten Dateisysteme speichern Dateien in Blöcken fester Größe, außer dass der letzte Block teilweise sein kann. Es gibt keine Möglichkeit, die vorhandenen Daten zu ändern, wenn die Änderung die Größe des geänderten Elements ändern würde, es sei denn, die Änderung befindet sich am Ende oder die Änderung würde Daten um eine ganze Anzahl von Blöcken verschieben. Das Verschieben von Daten um eine ganze Anzahl von Blöcken würde nur zufällig funktionieren, und dafür gibt es keine weit verbreitete Schnittstelle¹.

Die effizienteste Methode zum Entfernen von Daten am Anfang einer Datei besteht darin, die Daten, die aufbewahrt werden müssen, in eine neue Datei zu kopieren. Genau das ist tail -n +42 oder sed '41,$p' tun.

¹ Moderne Linux-Systeme haben einen Systemaufruf, um einen Teil einer Datei zu entfernen:fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …) , die Sie über das Hilfsprogramm fallocate --collapse-range=… aufrufen können . Es gibt auch FALLOC_FL_INSERT_RANGE und --insert-range . Aber sie sind auf Blöcke beschränkt, was sie für Textdateien meist unbrauchbar macht, und sie sind nicht mit allen Dateisystemen verfügbar.

Verwandte:Wie erhalte ich die Dateikopfgröße des TIFF-Bildes?
Linux
  1. Wie entferne ich Leerzeilen aus einer Datei (einschließlich Tabulatoren und Leerzeichen)?

  2. Zeilen basierend auf dem ersten Zeichen der nächsten Zeile verketten?

  3. Wie entferne ich „Binärdaten“ aus einer Textdatei (z. B. Bash_history)?

  4. Zusätzliche Kopfzeilen außer der ersten Zeile aus der Datei entfernen?

  5. Löschen bestimmter Zeilen aus einer Datei in der Linux-Befehlszeile

So entfernen Sie Zeilen aus einer Datei mit dem Sed-Befehl

So entfernen Sie alle Leerzeichen aus einer Textdatei

Entfernen Sie ungerade oder gerade Zeilen aus einer Textdatei

Entfernen Sie effizient die letzten beiden Zeilen einer extrem großen Textdatei

Entfernt eine bestimmte Zeile aus der Bash-Verlaufsdatei

Wie zeigt man bestimmte Zeilen aus einer Textdatei in Linux an?