GNU/Linux >> Tutoriels Linux >  >> Linux

Comment scinder un fichier et conserver la première ligne dans chacun des morceaux ?

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"'

Linux
  1. Comment insérer du texte au début de chaque ligne dans Vim

  2. Comment boucler sur les lignes d'un fichier ?

  3. Comment analyser chaque ligne d'un fichier texte comme argument d'une commande ?

  4. Comment puis-je faire en sorte que grep imprime les lignes en dessous et au-dessus de chaque ligne correspondante?

  5. Dans Bash, comment ajouter une chaîne après chaque ligne dans un fichier ?

Comment obtenir la date et l'heure actuelles en Python

Comment utiliser Sudo et le fichier Sudoers

Comment modifier les autorisations et les propriétaires via la ligne de commande

Comment enregistrer un fichier dans Vim / Vi et quitter l'éditeur

Comment compresser un fichier et conserver le fichier .gz ?

Comment diviser un gros fichier flac en pistes et remplir la balise id3 ?