Ce one-liner divisera le gros csv en morceaux de 999 enregistrements, en préservant la ligne d'en-tête en haut de chacun (donc 999 enregistrements + 1 en-tête =1000 lignes)
cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'
Basé sur la réponse d'Ole Tange.
Voir les commentaires pour quelques conseils sur l'installation parallèle
C'est robhruska script un peu nettoyé :
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
J'ai supprimé wc
, cut
, ls
et echo
dans les endroits où ils sont inutiles. J'ai changé certains des noms de fichiers pour les rendre un peu plus significatifs. Je l'ai divisé en plusieurs lignes uniquement pour faciliter la lecture.
Si vous voulez être fantaisiste, vous pouvez utiliser mktemp
ou tempfile
pour créer un nom de fichier temporaire au lieu d'en utiliser un codé en dur.
Modifier
Utilisation de GNU split
il est possible de faire ceci :
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_
Décomposé pour plus de lisibilité :
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_
Quand --filter
est spécifié, split
exécute la commande (une fonction dans ce cas, qui doit être exportée) pour chaque fichier de sortie et définit la variable FILE
, dans l'environnement de la commande, au nom du fichier.
Un script ou une fonction de filtrage peut effectuer toutes les manipulations qu'il souhaite sur le contenu de la sortie ou même sur le nom du fichier. Un exemple de ce dernier pourrait être de sortir vers un nom de fichier fixe dans un répertoire variable :> "$FILE/data.dat"
par exemple.
Vous pouvez utiliser la nouvelle fonctionnalité --filter dans GNU coreutils split>=8.13 (2011) :
tail -n +2 FILE.in | split -l 50 - --filter='sh -c "{ head -n1 FILE.in; cat; } > $FILE"'