155 votes

Concaténer des fichiers et insérer une nouvelle ligne entre les fichiers

J'ai plusieurs fichiers que je veux concaté avec cat . Disons

 File1.txt 
foo

File2.txt
bar

File3.txt
qux

Je veux concaténer pour que le fichier final ressemble à :

 foo

bar

qux

Au lieu de cela avec les cat File*.txt > finalfile.txt

 foo
bar 
qux

Quelle est la bonne façon de le faire?

152voto

codaddict Points 154968

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 d'exécuter la commande ci-dessus.

Si vous êtes autorisé à utiliser awk vous pouvez faire :

 awk 'FNR==1{print ""}1' *.txt > finalfile.txt

69voto

Si vous avez suffisamment de fichiers pour pouvoir les répertorier, vous pouvez utiliser la 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

36voto

Flexo Points 39273

Si c'était à moi de le faire, j'utiliserais sed :

 sed -e '$s/$/\n/' -s *.txt > finalfile.txt

Dans ce motif sed, $ a deux significations, d'abord il correspond au dernier numéro de ligne uniquement (comme une plage de lignes sur laquelle appliquer un motif) et d'autre part il correspond à la fin de la ligne dans le motif de substitution.

Si votre version de sed n'a pas -s (traitez les fichiers d'entrée séparément), vous pouvez cependant tout faire en boucle :

 for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt

11voto

Nick Roz Points 1298

Vous pouvez le faire en utilisant xargs si vous le souhaitez, mais l'idée principale reste la même :

 find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt

11voto

user3780389 Points 514

Cela fonctionne dans Bash :

 for f in *.txt; do cat $f; echo; done

Contrairement aux réponses avec >> (ajouter), la sortie de cette commande peut être redirigée vers 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 (conduite dans moins)
  • for ... done | head -n -1 (cela supprime la ligne vierge de fin)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X