J'ai 14 fichiers faisant tous partie d'un texte. Je voudrais les fusionner en un. Comment faire ça?
89
J'ai 14 fichiers faisant tous partie d'un texte. Je voudrais les fusionner en un. Comment faire ça?
C'est techniquement ce que cat
("concaténer") est censé faire, même si la plupart des gens l'utilisent simplement pour sortir des fichiers sur stdout. Si vous lui donnez plusieurs noms de fichiers, il les affichera tous de manière séquentielle et vous pourrez ensuite les rediriger vers un nouveau fichier. dans le cas de tous les fichiers, utilisez-le simplement *
(ou /path/to/directory/*
si vous n'êtes pas déjà dans le répertoire) et votre shell l'étendra à tous les noms de fichiers
$ cat * > merged-file
*
dans un ordre "naturel". Si vous avez "fichier1.txt ... fichier9.txt ... fichier14.txt", cela ne fonctionnera pas car fichier1? .Txt fera le tri entre fichier1.txt et fichier2.txt. Vous devez les renommer "fichier01.txt ... fichier09.txt ... fichier14.txt". Disecho *
si tu n'es pas sur.numeric_glob_sort
option).Si vos fichiers ne sont pas dans le même répertoire, vous pouvez utiliser la commande find avant la concaténation:
Très utile lorsque vos fichiers sont déjà commandés et que vous souhaitez les fusionner pour les analyser.
Plus portable:
Cela peut ou peut ne pas préserver l'ordre des fichiers.
la source
"*.csv"
, car le shell transmettrait alors le littéral*
àfind
.La commande
a en fait l’effet secondaire indésirable d’inclure un «fichier fusionné» dans la concaténation, ce qui crée un fichier vide. Pour résoudre ce problème, écrivez le fichier fusionné dans un autre répertoire.
ou utilisez une correspondance de modèle qui ignorera le fichier fusionné;
la source
cat * > merged-file
fonctionne bien. Les Globs sont traités avant la création du fichier. S'ilmerged-file
existe déjà, lecat
mien détectera qu'il s'agit du fichier de sortie et refusera de le lire. SI le fichier existe déjà ET que vous avez la redirection plus tard dans le pipeline, il ne peut évidemment pas le faire, aussi vous obtenez-vous alors le fichier emballé.cat
n'a aucun moyen de détecter si le fichier est le fichier de sortie. La redirection se passe dans le shell;cat
imprime uniquement sur la sortie standard.Comme les autres d'ici disent ... Vous pouvez utiliser
cat
Disons que vous avez:
Et vous ne souhaitez que
file01
pourfile03
etfileA
àfileC
:Ou, en utilisant une extension par attelle
Ou, en utilisant une extension plus sophistiquée:
Ou vous pouvez utiliser la
for
boucle:la source
[01-03]
ne fonctionnera pas comme un motif globulant.Vous pouvez spécifier le
pattern
fichier, puis les fusionner comme suit:la source
Une autre option est sed:
Ou...
Ou...
Ou sans redirection ...
Notez que la dernière ligne écrit également merge.txt (pas wmerge.txt!). Vous pouvez utiliser w "merge.txt" pour éviter toute confusion avec le nom du fichier et -n pour une sortie silencieuse.
Bien sûr, vous pouvez également raccourcir la liste de fichiers avec des caractères génériques. Par exemple, dans le cas de fichiers numérotés comme dans les exemples ci-dessus, vous pouvez spécifier la plage avec des accolades de la manière suivante:
la source