Dies ist Robhruskas Drehbuch, das ein bisschen aufgeräumt wurde:
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 entfernte wc
, cut
, ls
und echo
an den Orten , wo sie nicht notwendig sind. Ich habe einige der Dateinamen geändert, um sie ein wenig aussagekräftiger zu machen. Ich habe es in mehrere Zeilen aufgeteilt, um das Lesen zu erleichtern.
Wenn Sie Lust haben, können Sie einen temporären Dateinamen verwenden mktemp
oder tempfile
erstellen, anstatt einen fest codierten zu verwenden.
Bearbeiten
Mit GNU ist split
dies 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_
Aus Gründen der 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, wird split
der Befehl (in diesem Fall eine Funktion, die exportiert werden muss) für jede Ausgabedatei ausgeführt und die Variable FILE
in der Befehlsumgebung auf den Dateinamen gesetzt.
Ein Filterskript oder eine Funktion kann jede gewünschte Manipulation des Ausgabeinhalts oder sogar des Dateinamens vornehmen. Ein Beispiel für Letzteres könnte die Ausgabe an einen festen Dateinamen in einem Variablenverzeichnis sein: > "$FILE/data.dat"
zum Beispiel.
split
nicht wahr?