Réponses:
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
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:
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 portable:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
Cela peut ou peut ne pas préserver l'ordre des fichiers.
"*.csv"
, car le shell transmettrait alors le littéral *
à find
.
La commande
$ cat * > merged-file
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.
$ cat * > ../merged-file
ou utilisez une correspondance de modèle qui ignorera le fichier fusionné;
$ cat *.txt > merged-file
cat * > merged-file
fonctionne bien. Les Globs sont traités avant la création du fichier. S'il merged-file
existe déjà, le cat
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:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
Et vous ne souhaitez que file01
pour file03
et fileA
à fileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
Ou, en utilisant une extension par attelle
cat ~/file0{1..3} ~/file{A..C} > merged-file
Ou, en utilisant une extension plus sophistiquée:
cat ~/file{0{1..3},{A..C}} > merged-file
Ou vous pouvez utiliser la for
boucle:
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
ne fonctionnera pas comme un motif globulant.
Vous pouvez spécifier le pattern
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 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:
sed -n w"merge.txt" {1..3}.txt
*
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.