Ich arbeite an einem Problem, wo ich einen bestimmten Bereich von Zeilen in einer riesigen Textdatei mit Daten aus einem anderen (kleiner, aber immer noch großen) Text ersetzen muss Datei.Bash - Ersetzen kleiner Linien in einer großen Textdatei effizient
Angenommen, file1 hat 10.000 Zeilen und file2 3.000 Zeilen. Ich muss Operationen vom Typ durchführen: extrahiere die Zeilen 901-970 aus Datei2 und füge diese in die Zeilen 8701-8770 von Datei1 ein und ersetze, was vorher da war. In dem Problem, ich arbeite an Datei1 hat 61 Millionen Zeilen und Datei2 18 Millionen. Ich muss diese Operation effizient durchführen, da sie mehrmals ausgeführt wird - am Ende wird der gesamte Inhalt von Datei2 irgendwo in Datei1 sein.
Die beste Lösung, die ich bis jetzt habe, besteht darin, die zwei Dateien in kleine Dateien zu teilen, die jeweils die Anzahl der Zeilen des Blocks haben, die kopiert und ersetzt werden (70 im obigen Beispiel). Dies erwies sich als viel effizienter als eine Kopf-und-Schwanz-Kombination, um Teile der Datei zu extrahieren, aber dennoch müssen Teile der Datei berührt werden, die nicht verändert wurden.
Ich frage mich, ob es eine awk/grep/sed Lösung zu diesem gibt. Das Extrahieren eines Teils von Datei2 ist nicht das Problem, aber ich konnte nicht herausfinden, wie man einen Block von Zeilen von Datei1 ersetzt, ohne die gesamte Datei zu laden.
Danke!
können Sie die Datei nicht unbedingt auf eine gerade Anzahl von Zeilen partitionieren. Zum Beispiel: Datei1_1 (1-900), Datei1_2 (901_970), Datei1_3 (971_) und ähnlich für Datei2. Dann schließe dich den Abschnitten an. File1_1, File2_1, File1_3 usw. Wenn Ihre Abschnitte groß sind, bedeutet dies, dass die Abschnittsanzahl überschaubar ist. – karakfa
sollten Sie klarstellen, wenn Sie buchstäblich nach Zeilennummern verarbeiten möchten, oder wenn dies nur eine Annäherung ist, um uns den Umfang des Problems zu zeigen, aber Sie wirklich nach bestimmten Zeichenfolgen suchen, um zu markieren, wo Ersetzungen auftreten werden. Viel Glück – shellter
@ Karafka das ist auch eine Möglichkeit, aber da ich mehrere Ersetzungen in der gesamten Datei tun muss, würde ich immer noch eine große Anzahl von Abschnitten haben. Vielen Dank. – Albertini