web-dev-qa-db-fra.com

Comment diviser un fichier en n nombre de parties

J'ai un fichier continuant quelques no de lignes. Je veux diviser le fichier en nnde fichiers avec des noms particuliers. Peu importe le nombre de lignes présentes dans chaque fichier. Je veux juste un nombre particulier de fichiers (disons 5). Ici, le problème est que le nombre de lignes dans le fichier original continue à changer. Je dois donc calculer le nombre de lignes, puis diviser les fichiers en 5 parties. Si possible, nous devons les envoyer dans des répertoires différents.

21
new person

Dans bash, vous pouvez utiliser la commande split pour la scinder en fonction du nombre de lignes souhaité. Vous pouvez utiliser la commande wc pour déterminer le nombre de lignes souhaitées. Voici wc combiné avec split sur une seule ligne.

Par exemple, pour scinder onepiece.log en 5 parties

    split -l$((`wc -l < onepiece.log`/5)) onepiece.log onepiece.split.log -da 4

Cela créera des fichiers comme onepiece.split.log0000 ...

Remarque : la division bash arrondit à la fin, donc s'il reste un reste, il y aura un 6ème fichier partiel.

29
sketchytechky

Supposons que vous traitez un fichier texte, puis wc -l pour déterminer le nombre total de lignes et split -l à scinder en un nombre spécifié de lignes (total/5 dans votre cas). Cela fonctionne sous UNIX/Mac et Windows (si vous avez cygwin installé)

6
bjg

Sur Linux, il y a une split command,

split --lines=1m /path/to/large/file /path/to/output/file/prefix

Sortie de morceaux de taille fixe INPUT dans PREFIXaa, PREFIXab, ...; la taille par défaut est de 1000 lignes et PREFIX par défaut est 'x'. Sans INPUT, ou lorsque INPUT est -, lisez l'entrée standard.

...

-l, --lines = NUMBER mettre NUMBER lignes par fichier de sortie

...

Vous devrez toutefois calculer la taille réelle des scissions à l’avance.

6
miku

Je peux penser à plusieurs façons de le faire. Ce que vous utiliseriez dépend beaucoup des données. 

  1. Les lignes ont une longueur fixe: recherchez la taille du fichier en lisant son entrée de répertoire et divisez-la par la longueur de la ligne pour obtenir le nombre de lignes. Utilisez-le pour déterminer le nombre de lignes par fichier.

  2. Les fichiers doivent seulement avoir à peu près le même nombre de lignes. Lisez à nouveau la taille du fichier à partir de l'entrée du répertoire. Lisez les N premières lignes (N doit être petit, mais une fraction raisonnable du fichier) pour calculer une longueur de ligne moyenne. Calculez le nombre approximatif de lignes en fonction de la taille du fichier et de la longueur moyenne prévue. Cela suppose que la longueur de la ligne suit une distribution normale. Si ce n'est pas le cas, ajustez votre méthode pour échantillonner des lignes de manière aléatoire (à l'aide de seek () ou quelque chose de similaire). Rembobinez le fichier après avoir défini votre moyenne, puis divisez-le en fonction de la longueur de ligne prévue.

  3. Lisez le fichier deux fois. La première fois, comptez le nombre de lignes. La deuxième fois, divisez le fichier en plusieurs parties.

EDIT: À l'aide d'un script Shell (selon vos commentaires), la version aléatoire de # 2 serait difficile à moins que vous n'ayez écrit un petit programme pour le faire à votre place. Vous devriez pouvoir utiliser ls -l pour obtenir la taille du fichier, wc -l pour compter le nombre exact de lignes et head -nNNN | wc -c pour calculer la longueur moyenne des lignes.

0
tvanfosson