J'ai plusieurs fichiers que je veux concatiner avec cat
. Disons
File1.txt
foo
File2.txt
bar
File3.txt
qux
Je veux concatter pour que le fichier final ressemble à ceci:
foo
bar
qux
Au lieu de cela avec d'habitude cat File*.txt > finalfile.txt
foo
bar
qux
Quelle est la bonne façon de le faire?
Tu peux faire:
for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done
Assurez-vous que le fichier finalfile.txt
n'existe pas avant que vous exécutiez la commande ci-dessus.
Si vous êtes autorisé à utiliser awk
, vous pouvez faire:
awk 'FNR==1{print ""}1' *.txt > finalfile.txt
Si vous avez assez de fichiers pour pouvoir les lister, vous pouvez utiliser substitution de processus dans Bash, en insérant une nouvelle ligne entre chaque paire de fichiers:
cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt
Si c'était moi qui le faisais, j'utiliserais sed:
sed -e '$s/$/\n/' -s *.txt > finalfile.txt
Dans ce modèle sed, $ a deux significations: d’une part, il correspond uniquement au dernier numéro de ligne (sous la forme d’une plage de lignes sur laquelle appliquer un motif) et, d’autre part, il correspond à la fin de la ligne du modèle de substitution.
Si votre version de sed n'a pas -s
(traiter les fichiers d’entrée séparément), vous pouvez tout faire en boucle:
for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt
Vous pouvez le faire en utilisant xargs
si vous le souhaitez, mais l’idée principale est toujours la même:
find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt
Voilà comment je viens de le faire sur OsX 10.10.3
for f in *.txt; do (cat $f; echo '') >> fullData.txt; done
depuis la simple commande 'echo' sans paramètre, aucune nouvelle ligne n'a été insérée.
Cela fonctionne dans Bash:
for f in *.txt; do cat $f; echo; done
Contrairement aux réponses avec >>
(append), la sortie de cette commande peut être transmise à d’autres programmes.
Exemples:
for f in File*.txt; do cat $f; echo; done > finalfile.txt
(for ... done) > finalfile.txt
(les parenthèses sont facultatives)for ... done | less
(passe dans moins)for ... done | head -n -1
_ (cela supprime la dernière ligne vide)En python, cela concatène des lignes vides entre les fichiers (le fichier ,
supprime l'ajout d'une ligne vierge de fin supplémentaire):
print '\n'.join(open(f).read() for f in filenames),
Voici le vilain python une ligne qui peut être appelé à partir du shell et affiche le résultat dans un fichier:
python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt