Dieser Einzeiler teilt die große CSV-Datei in Stücke von 999 Datensätzen auf, wobei die Kopfzeile am Anfang jedes Datensatzes erhalten bleibt (also 999 Datensätze + 1 Kopfzeile =1000 Zeilen)
cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'
Basierend auf der Antwort von Ole Tange.
In den Kommentaren finden Sie einige Tipps zur parallelen Installation
Das ist robhruskas Skript etwas aufgeräumt:
tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
head -n 1 file.txt > tmp_file
cat "$file" >> tmp_file
mv -f tmp_file "$file"
done
Ich habe wc
entfernt , cut
, ls
und echo
an den Stellen, wo sie unnötig sind. Ich habe einige der Dateinamen geändert, um sie etwas aussagekräftiger zu machen. Ich habe es in mehrere Zeilen aufgeteilt, nur um es leichter lesbar zu machen.
Wenn Sie Lust haben, können Sie mktemp
verwenden oder tempfile
um einen temporären Dateinamen zu erstellen, anstatt einen fest codierten zu verwenden.
Bearbeiten
Mit GNU split
Folgendes ist möglich:
split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }; export -f split_filter; tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_
Zur besseren Lesbarkeit aufgeschlüsselt:
split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }
export -f split_filter
tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_
Wenn --filter
angegeben ist, split
führt den Befehl (in diesem Fall eine Funktion, die exportiert werden muss) für jede Ausgabedatei aus und setzt die Variable FILE
, in der Umgebung des Befehls, zum Dateinamen.
Ein Filterskript oder eine Funktion könnte den Ausgabeinhalt oder sogar den Dateinamen beliebig manipulieren. Ein Beispiel für letzteres könnte die Ausgabe in einen festen Dateinamen in einem variablen Verzeichnis sein:> "$FILE/data.dat"
zum Beispiel.
Sie könnten die neue --filter-Funktionalität in GNU coreutils split>=8.13 (2011) verwenden:
tail -n +2 FILE.in | split -l 50 - --filter='sh -c "{ head -n1 FILE.in; cat; } > $FILE"'