Wie kann man eine Textdatei leicht in kleine Stücke aufteilen, die kleiner als ein Schwellenwert sind?

5745
WilliamKF

Ich habe einige Textdateien mit einer Länge von 100 bis 300 MB, die ich in Emacs anzeigen möchte, aber mein Emacs gerät in einige Leistungsprobleme, wenn solche großen Dateien geöffnet und durchsucht werden. Daher suche ich nach einem einfachen Hilfsprogramm, um eine Datei in überschaubare Blöcke (jeweils 50 MB) aufzuteilen und die Blöcke anhand des ursprünglichen Namens und eines Suffixes zu benennen, um deren Position in der Sequenz anzugeben. Jeder Chunk würde dort weitermachen, wo der vorherige gekürzt wurde, und nicht länger als 50 MB sein, wobei der letzte Chunk möglicherweise kürzer ist.

Gibt es ein einfaches Werkzeug, um dies auf einem Linux-Computer zu tun, vielleicht so etwas wie Kopf oder Schwanz, das mehrere Ergebnisse liefert, eines für jedes Stück?

Wenn Sie beispielsweise eine Datei test.outmit 120 MB Länge verwenden, teilen Sie sie test.out.1für die ersten 50 MB, test.out.2für die zweiten 50 MB und test.out.3für die restlichen 20 MB am Ende der Datei auf.

Ich könnte Kombinationen von headund verwenden tail, um die Teile zu erhalten, aber ich hätte gerne ein Werkzeug, das dies alles abstrahiert, vielleicht ein Perl-Skript oder ein Python-Skript, das jemand bereits für eine solche Aufgabe erstellt hat.

5

1 Antwort auf die Frage

18
Hennes

Dafür gibt es schon ein schönes Werkzeug: split

> man 1 splittet   NAME Teilen - Eine Datei in Teile aufteilen  ZUSAMMENFASSUNG split [-l Zeilenzahl] [-a Suffix_length] [Datei [Präfix]] split -b byte_count [K | k | M | m | G | g] [-a Suffix_length] [Datei [Präfix]] split -p pattern [-a Suffix_length] [Datei [Präfix]] 


split --bytes 50M test.out test.out_würde die Datei test.outin test.out_xaa, test.out_xab, test.out_xac, ... aufteilen

Eine viel hässlichere Lösung wäre zu verwenden dd

dd if=test.out of=test.out.part1 bs=1M count=50 skip=0Erstellt eine Datei namens test.out.part1 mit den ersten 50 MB von test.out. Sie können den Wert für überspringen auf 1 erhöhen, um den zweiten Block zu erhalten, auf 2 für den dritten usw. usw. Vergewissern Sie sich, dass Sie auch die Dateinamen ändern. Andernfalls überschreiben Sie die gleiche Ausgabedatei.

Mindestens in meinem Linux ist für Megabytes ein Kleinbuchstabe "m" erforderlich. WilliamKF vor 11 Jahren 0
Noch ein neuer Befehl gelernt ☺ Ramchandra Apte vor 11 Jahren 0
@williamKF: Welche Linux-Variante war das? Ich habe Ubuntu und FreeBSD überprüft. FreeBSD benötigte das `-b 50M` (keine Option für - Bytes). Und Ubuntu akzeptierte sowohl das reguläre "m" als auch das "M". Hennes vor 11 Jahren 0
@Hennes `split (coreutils) 5.2.1 February 2011` auf meinem Linux centos4 32 Bit 2.6.9-103.ELsmp # 1 SMP Fri Dec 9 04:31:51 EST 2011 i686 i686 i386 GNU / Linux WilliamKF vor 11 Jahren 0