2010-07-07 8 views
13

Ich habe eine Datei mit einigen Zeilen nicht. Ich möchte geteilte Datei in n no.of Dateien mit bestimmten Namen. Es spielt keine Rolle, wie viele Zeilen in jeder Datei vorhanden sind. Ich möchte nur eine bestimmte Anzahl von Dateien (sagen wir 5). Hier ist das Problem, dass sich die Anzahl der Zeilen in der ursprünglichen Datei ändert. Also muss ich keine Zeilen berechnen und dann die Dateien in 5 Teile aufteilen. Wenn möglich, müssen wir sie in verschiedene Verzeichnisse schicken.Wie spalte ich eine Datei in n keine Teile

+2

Verwenden von was? Ein Werkzeug, eine Programmiersprache, ein Skript ...? –

+0

Windows, Linux? Welche Sprache (n) haben Sie verfügbar? –

+0

Ich muss es in UNIX tun –

Antwort

4

Unter Linux gibt es ein split Befehl,

split --lines=1m /path/to/large/file /path/to/output/file/prefix 

Ausgabe mit fester Größe Stücke von INPUT zu PREFIXaa, PREFIXab, ...; Die Standardgröße beträgt 1000 Zeilen und der Standardwert PREFIX ist 'x'. Ohne INPUT oder wenn INPUT - ist, lesen Sie den Standard-Eingang.

...

-l, --lines = NUMBER put NUMBER Zeilen pro Ausgabedatei

...

Sie würden die tatsächliche Größe der Splits haben berechnen vorher aber.

+1

Dies teilt Zeilen oder Bytes? –

+0

Hier ändert sich auch die Größe der Datei täglich. Also brauche ich allgemeine Antwort, wo wir weder Größe noch Anzahl der Zeilen verwenden sollten. –

+0

Ich muss ein Shell-Skript dafür schreiben. Kann mir jemand dabei helfen? –

6

Angenommen, Sie verarbeiten eine Textdatei, dann wc -l, um die Gesamtzahl der Zeilen zu bestimmen, und split -l, um in eine bestimmte Anzahl von Zeilen aufzuteilen (insgesamt/5 in Ihrem Fall). Dies funktioniert unter UNIX/Mac und Windows (wenn Sie cygwin installiert haben)

0

Ich kann mir ein paar Möglichkeiten vorstellen, es zu tun. Was Sie verwenden würden, hängt sehr von den Daten ab.

  1. Linien werden Länge festgelegt: die Größe der Datei finden, indem es Verzeichniseintrag und dividieren durch die Leitungslänge zu lesen, die Anzahl der Linien zu erhalten. Verwenden Sie diese Option, um die Anzahl der Zeilen pro Datei festzulegen.

  2. Die Dateien müssen nur ungefähr die gleiche Anzahl von Zeilen haben. Lesen Sie erneut die Dateigröße aus dem Verzeichniseintrag. Lesen Sie die ersten N Zeilen (N sollte klein sein, aber einen vernünftigen Bruchteil der Datei), um eine durchschnittliche Zeilenlänge zu berechnen. Berechnen Sie die ungefähre Anzahl der Zeilen basierend auf der Dateigröße und der vorhergesagten durchschnittlichen Zeilenlänge. Dies setzt voraus, dass die Zeilenlänge einer Normalverteilung folgt. Wenn nicht, passen Sie Ihre Methode so an, dass Sie Zeilen zufällig abtasten (mit seek() oder etwas Ähnlichem). Spulen Sie die Datei nach dem Durchschnitt zurück, und teilen Sie sie dann auf der Grundlage der vorhergesagten Zeilenlänge.

  3. Die Datei zweimal lesen. Beim ersten Mal zählen Sie die Anzahl der Zeilen. Das zweite Mal die Datei in die erforderlichen Teile aufteilen.

EDIT: ein Shell-Skript verwendet (nach Ihren Kommentaren), die randomisierte Version # 2 wäre schwierig, wenn Sie ein kleines Programm geschrieben, dass für Sie tun. Sie sollten ls -l verwenden können, um die Dateigröße zu erhalten, wc -l, um die genaue Anzahl der Zeilen zu zählen, und head -nNNN | wc -c, um die durchschnittliche Zeilenlänge zu berechnen.

19

In bash können Sie den Befehl split verwenden, um ihn basierend auf der Anzahl der gewünschten Zeilen zu teilen. Sie können den Befehl wc verwenden, um herauszufinden, wie viele Zeilen gewünscht sind. Hier ist wc kombiniert mit split in einer Zeile.

Zum Beispiel onepiece.log in 5 Teile aufzuspalten

split -l$((`wc -l < onepiece.log`/5)) onepiece.log onepiece.split.log -da 4 

Dies wird Dateien erstellen wie onepiece.split.log0000 ...

Hinweis: bash Division abrundet, so dass, wenn es einen Rest gibt es sei eine 6. Teildatei.

+8

** split -da 4 -l $ (('wc -l grasshopper

+0

ausgezeichnete Verbesserung, @grasshopper – Flowpoke

+0

diese Antwort ist prägnanter als die beiden [höher upvoted Fragen] (http://stackoverflow.com/questions/7764755/unix-how-to-split- a-file-in-gleich-teile-ohne-brechen-einzelne-linien) auf stackoverflow und askubuntu. –

Verwandte Themen