Ich habe eine große (nach Anzahl der Zeilen) Nur-Text-Datei, die ich in kleinere Dateien aufteilen möchte, auch nach Anzahl der Zeilen. Wenn meine Datei ungefähr 2 Millionen Zeilen enthält, möchte ich sie in 10 Dateien mit 200.000 Zeilen oder 100 Dateien mit 20.000 Zeilen aufteilen (plus eine Datei mit dem Rest; gleichmäßig teilbar zu sein spielt keine Rolle).
Ich könnte dies in Python ziemlich einfach tun, aber ich frage mich, ob es irgendeine Ninja-Möglichkeit gibt, dies mit Bash- und Unix-Utils zu tun (im Gegensatz zum manuellen Schleifen und Zählen / Partitionieren von Zeilen).
cat part* > original
Antworten:
Haben Sie sich den Befehl split angesehen?
Sie könnten so etwas tun:
Dadurch werden Dateien mit jeweils 200000 Zeilen mit dem Namen
xaa xab xac
... erstellt.Eine weitere Option, aufgeteilt nach der Größe der Ausgabedatei (wird immer noch bei Zeilenumbrüchen aufgeteilt):
Erstellt Dateien mit
output_prefix01 output_prefix02 output_prefix03 ...
einer maximalen Größe von 20 Megabyte.quelle
split -b 200m filename
(m für Megabyte, k für Kilobyte oder kein Suffix für Bytes)-d
Option ist unter OSX nicht verfügbar, verwenden Siegsplit
stattdessen. Hoffe, dies ist nützlich für Mac-Benutzer.Wie wäre es mit dem Befehl split ?
quelle
Ja, es gibt einen
split
Befehl. Eine Datei wird nach Zeilen oder Bytes aufgeteilt.quelle
split -l 1000000 train_file train_file.
und im selben Verzeichnis erhalte ichtrain_file.aa
die erste Million, danntrail_file.ab
die nächste Million usw.split input my/dir/
.verwenden
split
Syntax split [options] [INPUT [PREFIX]]
http://ss64.com/bash/split.html
quelle
Verwenden:
Hier sind 1 und 100 die Zeilennummern, in denen Sie erfassen werden
output.txt
.quelle
split
wie alle Top-Antworten hier bereits sagen.Teilen Sie die Datei "file.txt" in Dateien mit 10000 Zeilen auf:
quelle
split
(von GNU coreutils, seit Version 8.8 vom 22.12.2010 ) enthält den folgenden Parameter:Somit
split -n 4 input output.
werden vier Dateien (output.a{a,b,c,d}
) mit der gleichen Anzahl von Bytes generiert , aber die Zeilen können in der Mitte unterbrochen sein.Wenn wir vollständige Zeilen beibehalten möchten (dh durch Zeilen geteilt), sollte dies funktionieren:
Verwandte Antwort: https://stackoverflow.com/a/19031247
quelle
Wenn Sie jede Datei nur durch x Zeilen teilen möchten, sind die angegebenen Antworten
split
in Ordnung. Aber ich bin neugierig, dass niemand auf Anforderungen geachtet hat:Ich kann das nicht ohne "wc + cut" machen, aber ich benutze das:
Dies kann einfach zu Ihren bashrc-Funktionen hinzugefügt werden, sodass Sie es einfach über Dateinamen und Chunks aufrufen können:
Wenn Sie nur x Chunks ohne Rest in einer zusätzlichen Datei möchten, passen Sie die Formel einfach an, um sie (Chunks - 1) für jede Datei zu summieren. Ich benutze diesen Ansatz, weil ich normalerweise nur x Anzahl von Dateien anstelle von x Zeilen pro Datei möchte:
Sie können das einem Skript hinzufügen und es Ihren "Ninja-Weg" nennen, denn wenn nichts Ihren Anforderungen entspricht, können Sie es erstellen :-)
quelle
-n
Option vonsplit
.Sie können auch awk verwenden
quelle
awk -v lines=200000 -v fmt="%d.txt" '{print>sprintf(fmt,1+int((NR-1)/lines))}'
HDFS getmerge kleine Datei und verschüttet in Eigenschaftsgröße.
Diese Methode führt zu Zeilenumbrüchen
Ich versuche, jede Datei in ungefähr 128 MB aufzuteilen.
quelle