Es gibt ein Dienstprogramm, das als Argumente die Zeilennummern verwendet, die die erste der jeweils neuen Datei werden sollen: csplit
. Dies ist ein Wrapper um die POSIX-Version :
Nach dem Namen der Datei, die aufgeteilt werden soll, werden die Verhältnisse für die Größen der aufgeteilten Dateien relativ zu ihrer Summe, d. h.
, verwendet %Vor%sind alle gleichwertig.
Die Verwendung ähnelt dem Fall in der Frage wie folgt:
%Vor% Die Nummerierung beginnt jedoch mit Null, und es gibt keine Erweiterung txt
. Die GNU-Version unterstützt eine --suffix-format
-Option, die .txt
erlaubt. extension und die zu den akzeptierten Argumenten hinzugefügt werden könnten, aber das würde etwas komplizierteres als getopts
erfordern, um sie zu parsen.
Diese Lösung spielt sich gut mit sehr kurzen Dateien (zwei Dateien in zwei Teile aufteilen) und das schwere Heben wird von csplit
selbst erledigt.
Mit dem folgenden Bash-Skript können Sie den Prozentsatz wie
angeben %Vor% Sie können auch den Platzhalter .
verwenden, der den Prozentsatz bis zu 100% füllt.
Die aufgeteilte Datei wird nach
geschrieben %Vor% Das Skript generiert immer so viele part
Dateien, wie Zahlen angegeben sind.
Wenn die Prozentsätze zusammen 100 ergeben, wird cat part*
immer die Originaldatei erzeugen (keine doppelten oder fehlenden Zeilen).
Rufen Sie wie folgt auf:
%Vor% Ersetzen Sie " > "
durch >
im Skript, um partitionierte Dateien tatsächlich zu schreiben.
Die Variable w
erwartet Leerzeichen getrennte Zahlen. Dateien werden in diesem Verhältnis partitioniert. Zum Beispiel wird "2 1 1 3"
Dateien in vier mit einer Anzahl von Zeilen im Verhältnis 2: 1: 1: 3 partitionieren. Jede Zahlenfolge, die 100 ergibt, kann als Prozentwert verwendet werden.
Bei großen Dateien kann das Array a
zu viel Speicher belegen. Wenn das ein Problem ist, ist hier ein alternatives Skript awk
:
Dies passiert jede Datei zweimal. Einmal zum Zählen von Zeilen (via wc -l
) und einmal zum Schreiben partitionierter Dateien. Aufruf und Wirkung ist ähnlich wie bei der ersten Methode.
Ich mag Benjamins csplit
Lösung, aber es ist so lang ...
(Die Bits if(r > 1 && r < n)
und uniq
sollen das Erstellen leerer Dateien oder merkwürdiges Verhalten für kleine Prozentsätze, Dateien mit geringer Anzahl von Zeilen oder Prozentangaben, die zu mehr als 100 hinzukommen, verhindern.)
Ich bin Ihrem Beispiel gefolgt und habe das, was Sie tun, manuell zu einem Skript gemacht. Es ist vielleicht nicht die schnellste oder "beste", aber wenn Sie verstehen, was Sie jetzt tun und es nur "skriptifizieren" können Sie besser dran sein, sollten Sie es beibehalten müssen.
%Vor%