J'ai un grand fichier texte (en nombre de lignes) que je voudrais diviser en fichiers plus petits, également en nombre de lignes. Donc, si mon fichier contient environ 2 millions de lignes, je voudrais le diviser en 10 fichiers qui contiennent 200 000 lignes ou 100 fichiers qui contiennent 20 000 lignes (plus un fichier avec le reste; être également divisible n'a pas d'importance).
Je pourrais le faire assez facilement en Python, mais je me demande s'il existe un moyen ninja de le faire en utilisant des utilitaires bash et unix (par opposition aux boucles et aux lignes de comptage / partitionnement manuelles).
cat part* > original
Réponses:
Avez-vous regardé la commande split?
Vous pourriez faire quelque chose comme ça:
qui va créer des fichiers contenant chacun 200000 lignes nommées
xaa xab xac
...Une autre option, divisée par la taille du fichier de sortie (toujours divisée lors des sauts de ligne):
crée des fichiers comme
output_prefix01 output_prefix02 output_prefix03 ...
chacun d'une taille maximale de 20 mégaoctets.la source
split -b 200m filename
(m pour les mégaoctets, k pour les kilo-octets ou aucun suffixe pour les octets)-d
n'est pas disponible sur OSX, utilisezgsplit
plutôt. J'espère que cela sera utile pour les utilisateurs de Mac.Et la commande split ?
la source
Oui, il y a une
split
commande. Il divisera un fichier par lignes ou octets.la source
split -l 1000000 train_file train_file.
et dans le même répertoire, j'obtiendraitrain_file.aa
avec le premier million, puistrail_file.ab
avec le prochain million, etc.split input my/dir/
.utilisation
split
Syntax split [options] [INPUT [PREFIX]]
http://ss64.com/bash/split.html
la source
Utilisation:
Ici, 1 et 100 sont les numéros de ligne dans lesquels vous allez capturer
output.txt
.la source
split
comme toutes les meilleures réponses ici déjà vous dire.divisez le fichier "file.txt" en fichiers de 10000 lignes:
la source
split
(de GNU coreutils, depuis la version 8.8 du 22/12/2010 ) inclut le paramètre suivant:Ainsi,
split -n 4 input output.
générera quatre fichiers (output.a{a,b,c,d}
) avec la même quantité d'octets, mais les lignes peuvent être interrompues au milieu.Si nous voulons conserver des lignes complètes (c'est-à-dire divisées par lignes), cela devrait fonctionner:
Réponse connexe: https://stackoverflow.com/a/19031247
la source
Dans le cas où vous souhaitez simplement diviser par x nombre de lignes chaque fichier, les réponses données
split
sont correctes. Mais je suis curieux de savoir que personne n'a prêté attention aux exigences:Je ne peux pas faire ça sans "wc + cut", mais j'utilise ça:
Cela peut être facilement ajouté à vos fonctions bashrc afin que vous puissiez simplement l'invoquer en passant le nom de fichier et les morceaux:
Dans le cas où vous ne voulez que x morceaux sans reste dans un fichier supplémentaire, adaptez simplement la formule pour la additionner (morceaux - 1) sur chaque fichier. J'utilise cette approche car généralement je veux juste x nombre de fichiers plutôt que x lignes par fichier:
Vous pouvez ajouter cela à un script et l'appeler votre "façon ninja", car si rien ne répond à vos besoins, vous pouvez le construire :-)
la source
-n
option desplit
.vous pouvez également utiliser awk
la source
awk -v lines=200000 -v fmt="%d.txt" '{print>sprintf(fmt,1+int((NR-1)/lines))}'
HDFS getmerge petit fichier et déversé dans la taille de la propriété.
Cette méthode provoquera un saut de ligne
J'essaie d'obtenir et de diviser en environ 128 Mo chaque fichier.
la source