J'ai 14 fichiers faisant tous partie d'un même texte. Je voudrais les fusionner en un seul. 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 vers stdout. Si vous lui donnez plusieurs noms de fichiers, ils les afficheront tous de manière séquentielle, puis vous pourrez les rediriger vers un nouveau fichier; dans le cas de tous les fichiers, utilisez simplement *
(ou /path/to/directory/*
si vous n'êtes pas déjà dans le répertoire) et votre Shell le développera à tous les noms de fichiers
$ cat * > merged-file
Si vos fichiers ne se trouvent pas dans le même répertoire, vous pouvez utiliser la commande find avant la concaténation:
find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
Très utile lorsque vos fichiers sont déjà commandés et que vous souhaitez les fusionner pour les analyser.
Plus facilement:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
Cela peut ou non préserver l'ordre des fichiers.
La commande
$ cat * > merged-file
a en fait l'effet secondaire indésirable d'inclure "fichier fusionné" dans la concaténation, créant un fichier de fuite. Pour contourner ce problème, écrivez le fichier fusionné dans un répertoire différent;
$ cat * > ../merged-file
ou utilisez une correspondance de modèle qui ignorera le fichier fusionné;
$ cat *.txt > merged-file
Comme les autres d'ici, dites ... Vous pouvez utiliser cat
Disons que vous avez:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
Et vous voulez seulement file01
à file03
et fileA
à fileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
Ou, en utilisant l'expansion d'accolade:
cat ~/file0{1..3} ~/file{A..C} > merged-file
Ou, en utilisant l'expansion de l'attelle plus sophistiquée:
cat ~/file{0{1..3},{A..C}} > merged-file
Ou vous pouvez utiliser la boucle for
:
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
Vous pouvez spécifier le pattern
d'un fichier puis les fusionner comme suit:
cat *pattern* >> mergedfile
Une autre option est sed:
sed r 1.txt 2.txt 3.txt > merge.txt
Ou...
sed h 1.txt 2.txt 3.txt > merge.txt
Ou...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
Ou sans redirection ...
sed wmerge.txt 1.txt 2.txt 3.txt
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 des 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 cette manière:
sed -n w"merge.txt" {1..3}.txt