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....
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 .....
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
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: