Comment diviser un fichier texte en plusieurs fichiers * .txt?

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 

-l est le nombre de lignes dans chaque fichier. Cela va créer:

  • output_fileaa
  • output_fileab
  • output_fileac
  • output_filead
  • ….

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;