J’ai un fichier texte file.txt
(12 Mo) contenant:
something1 something2 something3 something4 (...)
Est-il possible de diviser file.txt
en 12 fichiers * .txt, par exemple file2.txt
, file3.txt
, file4.txt
(…)?
Vous pouvez utiliser l’utilitaire de base linux bash
split -b 1M -d file.txt file
Notez que M
ou MB
sont OK, mais la taille est différente. MB est 1000 * 1000, M est 1024 ^ 2
Si vous voulez séparer par des lignes, vous pouvez utiliser le paramètre -l
.
METTRE À JOUR
a=(`wc -l yourfile`) ; lines=`echo $a/12 | bc -l` ; split -l=$lines -d file.txt file
Une autre solution proposée par Kirill , vous pouvez faire quelque chose comme ceci
split -nl/12 file.txt
Notez que l
not 1, split -n
a quelques options, comme N
, k/N
, l/k/N
, r/N
, r/k/N
$ split -l 100 input_file output_file
où -l
est le nombre de lignes dans chaque fichier. Cela va créer:
La réponse de John ne produira pas de fichiers .txt comme le veut le PO. Utilisation:
split -b=1M -d file.txt file --additional-suffix=.txt
Utiliser bash:
readarray -t LINES < file.txt COUNT=${#LINES[@]} for I in "${!LINES[@]}"; do INDEX=$(( (I * 12 - 1) / COUNT + 1 )) echo "${LINES[I]}" >> "file${INDEX}.txt" done
Utiliser awk:
awk '{ a[NR] = $0 } END { for (i = 1; i in a; ++i) { x = (i * 12 - 1) / NR + 1 sub(/\..*$/, "", x) print a[i] > "file" x ".txt" } }' file.txt
Contrairement à split
celui-ci s’assure que le nombre de lignes est le plus uniforme.
Indépendamment de ce qui est dit ci-dessus, sur mon Ubuntu 16, je devais faire:
> split -b 10M -d system.log system_split.log
S’il vous plaît noter l’espace entre -b et la valeur
Je suis d’accord avec @CS Pei, mais cela n’a pas fonctionné pour moi:
split -b=1M -d file.txt file
… comme le =
après -b
jeté. Au lieu de cela, je l’ai simplement supprimé et laissé aucun espace entre lui et la variable, et utilisé minuscule “m”:
split -b1m -d file.txt file
Et pour append “.txt”, nous utilisons ce que @schoon a dit:
split -b=1m -d file.txt file --additional-suffix=.txt
J’avais un fichier txt de 188.5MB et j’ai utilisé cette commande [mais avec -b5m
pour les fichiers de 5.2MB], et il a renvoyé 35 fichiers fractionnés qui étaient tous des fichiers txt et 5.2MB sauf le dernier qui était 5.0MB. Maintenant, comme je voulais que mes lignes restnt entières, je voulais diviser le fichier principal tous les 1 million de lignes, mais la commande split
ne me permettait même pas de faire -100000
encore moins ” -1000000
, donc un grand nombre de lignes à séparer ne fonctionnera pas.
Essayez quelque chose comme ça:
awk -vc=1 'NR%1000000==0{++c}{print $0 > c".txt"}' Datafile.txt for filename in *.txt; do mv "$filename" "Prefix_$filename"; done;