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, lsund echoan 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 mktempoder tempfileerstellen, anstatt einen fest codierten zu verwenden.
Bearbeiten
Mit GNU ist splitdies 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 --filterangegeben, wird splitder Befehl (in diesem Fall eine Funktion, die exportiert werden muss) für jede Ausgabedatei ausgeführt und die Variable FILEin 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.
splitnicht wahr?