So teilen Sie die Datei nach dem Prozentsatz der Nr. von Linien?

8

So teilen Sie die Datei nach dem Prozentsatz der Nr. von Linien?

Nehmen wir an, ich möchte meine Datei in drei Teile teilen (60% / 20% / 20% Teile), ich könnte das manuell machen, -_-:

%Vor%

Aber ich bin sicher, dass es einen besseren Weg gibt!

    
alvas 04.11.2016, 05:38
quelle

6 Antworten

8

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 :

%Vor%

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.

    
Benjamin W. 09.02.2017, 00:08
quelle
9
%Vor%

Ändern Sie " > " in nur > , um tatsächlich in die Ausgabedateien zu schreiben.

    
Ed Morton 04.11.2016 06:54
quelle
1

Verwendung

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.

%Vor%

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).

Bash-Skript: split.sh

%Vor%     
Socowi 08.02.2017 20:48
quelle
1
%Vor%

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 :

%Vor%

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.

    
pii_ke 08.02.2017 18:49
quelle
1

Ich mag Benjamins csplit Lösung, aber es ist so lang ...

%Vor%

(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.)

    
webb 08.02.2017 23:38
quelle
1

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%     
Mike Wodarczyk 14.02.2017 04:25
quelle

Tags und Links