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.
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.
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é)
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.
Je peux penser à plusieurs façons de le faire. Ce que vous utiliseriez dépend beaucoup des données.
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.
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.
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.