web-dev-qa-db-fra.com

Comment diviser un gros fichier?

Comment puis-je passer tous les fichiers dans un list.txt qui ressemble à

file1_1.txt
file1_2.txt
file1_3.txt
file1_4.txt

à la commande split (il y a d'autres fichiers txt dans le répertoire) et lui faire renvoyer les pièces numérotées comme dans (supposons que file1_1.txt serait divisé en 4 parties)

file1_1_1.txt;
file1_1_2.txt;
file1_1_3.txt;
file1_1_4.txt 

etc....

5
user3069326

Pour vous assurer qu'il n'y a pas de saut de ligne, vous pouvez utiliser une autre option que c.

split -n #number

diviser un fichier par # nombre de morceaux afin que vous puissiez ainsi être sûr qu'ils sont égaux et plus pas de rupture dans les lignes.Exemple

split -n 4 file.txt

Cela divisera le fichier.txt en 4 morceaux.

OU vous pouvez fractionner par nombre de lignes

split -l #number-of-lines

exemple

split -l 200 file.txt

Cela divisera le fichier file.txt en fichiers de 200 lignes chacun. Mais il n’est pas exact que tous aient la même longueur puisque le dernier fichier est peut-être inférieur au nombre choisi.

Maintenant en ce qui concerne la dénomination. La valeur par défaut de la commande split consiste à utiliser un suffixe par défaut "x" et des préfixes par défaut "aa" "ab" "ac" ...

Donc, pour changer ces valeurs par défaut, vous devez indiquer un suffixe à utiliser.

dans votre cas, vous pouvez utiliser

split -n #number file1_1.txt file1_1.

La sortie ressemblerait à file1_1.aa file1_1.ab file1_1.ac

Sinon, vous pouvez changer le préfixe par défaut pour qu'il soit numérique en utilisant -d

  split -n #number -d file1_1.txt file1_1.

La sortie ressemblerait à file1_1.00 file1_1.01 file1_1.02

Donc, vous ne pouvez pas obtenir le nom que vous voulez avec split par défaut à moins d’utiliser awk ou sed avec REGEX.

Maintenant, pour lire l’ensemble des fichiers d’un fichier, appelons files.list

while IFS= read -r file

do split -n #number -d "$file" "$file"

done < files.list

UPDATE: Je suis arrivé à ce https://unix.stackexchange.com/questions/32626/split-a-file-by- ligne-et-avoir-contrôle-extension-fichiers-résultants

Selon deuxième réponse

les versions récentes (≥ 8.16) de gnu split on peuvent utiliser le commutateur --additional-suffix pour avoir le contrôle sur l’extension résultante. De l'homme fendu:

--additional-suffix = SUFFIX ajoute un SUFFIX supplémentaire aux noms de fichiers. Donc, lorsque vous utilisez cette option:

split -dl 10000 --additional-suffix = .txt mots wrd les morceaux résultants se termineront automatiquement par .txt:

wrd00.txt wrd01.txt

Donc, dans votre cas, si votre version divisée est> 8.16, vous pouvez répondre à vos besoins de la manière suivante:

split -n #number -d --additional-suffix=.txt file1_1.txt file1_1-

Donc, la sortie serait comme

file1_1-00.txt file1_1-01.txt file1_1-02.txt .....
6
Maythux
while read file; do split <some options> "$file"; done < list.txt

Si vos noms de fichier peuvent contenir des espaces ou des barres obliques inverses, utilisez plutôt ceci:

while IFS= read -r file; do split <some options> "$file"; done < list.txt
2
Cyrus

Voici mon oneliner brut:

awk -F '.' '{$ 3 = $ 1; print $ 1 "." $ 2 "" $ 3 "_"}' list.txt | xargs -n2 split --numeric-suffixes = 1 -n 4 --suffix-length = 1 --additional-suffix = ". txt"

Explication:

Le fichier contient des entrées:

file1_1.txt
file1_2.txt
file1_3.txt
file1_4.txt

Nous prenons ceux avec awk, et en utilisant dot comme séparateur, créons une liste à deux colonnes

file1_1.txt file1_1_
file1_2.txt file1_2_
file1_3.txt file1_3_
file1_4.txt file1_4_

Ensuite, xargs prend cette sortie, deux entrées par exécution (-n2), et exécute une division avec des suffixes numériques commençant à 1, divisée en 4 fichiers et ajoute ".txt" à la fin. Et voici la démo de cet oneliner:

enter image description here

1