6 votes

Combiner plusieurs fichiers txt en un

Je suis en train de combiner plusieurs fichiers texte dans un grand fichier. Je veux les mettre en séquence mais cela ne semble pas fonctionner correctement.

À ce stade, j'ai essayé depuis le terminal : cat *.txt > merged.txt mais cela semble concaténer les fichiers de manière aléatoire.

Dans mon dossier, j'ai tous les fichiers nommés avec des numéros séquentiels (de 1.txt à 10000.txt). Est-ce que j'oublie quelque chose ?

10voto

grg Points 181593

Globbing n'est pas aléatoire, il est garanti d'être alphabétique (également connu sous le nom d'ordre lexicographique selon votre paramètre régional), ce qui est différent de l'ordre de tri numérique.

Vous pouvez utiliser l'expansion de l'accolade pour cela. Remplacez '10' par le numéro du dernier fichier.

cat {1..10}.txt > merged.txt

Ceci utilise l'expansion de l'accolade de bash, que vous pouvez lire dans LESS='+/Brace Expansion' man bash.

Notez que contrairement aux globes de fichiers, l'expansion de l'accolade générera des chaînes arbitraires qui ne doivent pas nécessairement être des fichiers existants ; dans ce cas, cela signifie que vous obtiendrez des erreurs s'il manque des fichiers dans la séquence (par exemple si 7.txt n'existe pas). Cependant, cela n'affectera pas le contenu de merged.txt qui sera produit comme prévu.

3voto

Wildcard Points 874

Utilisez zsh avec des globages étendus—et activez le tri numérique des expansions de globage avec le qualificateur de globage (n) :

zsh -c 'cat *.txt(n) > merged.txt'

Vous pouvez également être plus précis avec vos globages :

zsh -c 'cat <1-10000>.txt(n) > merged.txt'

Voir man zshexpn pour plus de détails.

2voto

musicman523 Points 281

Une autre réponse possible pourrait être :

ls | sort -n | xargs cat > merged.txt

Sur un système GNU/Linux, vous pouvez faire ls -v | xargs cat > merged.txt, mais ceci est spécifique à la version GNU de ls et ne fonctionne pas pour le ls de BSD.

1voto

The HCD Points 123

Attention. Si les fichiers sont effectivement numérotés de 1 à 10000, alors le système d'exploitation trie vos fichiers selon le premier nombre : 1.txt 11.txt 12.txt ... 19.txt 100.txt ... 2.txt 20.txt 21.txt

etc.

Vous devriez renommer les fichiers en 00001, 00002 et ainsi de suite.

1voto

glenn jackman Points 1869

Normalement, vous ne parcourez pas la sortie de ls, mais comme vos noms de fichiers ne contiennent pas d'espaces ou de caractères "inhabituels", nous pouvons le faire :

shopt -s extglob
ls +([0-9]).txt | sort -n | xargs cat > merged.txt

Le +([0-9]) est un motif de glob bash étendu pour ne correspondre qu'à un ou plusieurs chiffres.

Avec GNU ls (disponible via homebrew dans le paquet coreutils)

ls -v +([0-9]).txt | xargs cat > merged.txt

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X