web-dev-qa-db-fra.com

Concaténation de fichiers et insertion d'une nouvelle ligne entre fichiers

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?

104
neversaint

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
94
codaddict

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
38

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
33
Flexo

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
8
Nick Roz

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.

7
lbrutti

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)
7
user3780389

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
3
user3780389