J'ai plusieurs fichiers avec lesquels je souhaite concaténer 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 d'habitude cat File*.txt > finalfile.txt
foo
bar
qux
Quelle est la bonne façon de procéder?
Réponses:
Tu peux faire:
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:la source
AWK '{print $0}' *.txt
awk 'FNR==1 && NR > 1 ...'
Cependant, vous pouvez facilement vous prémunir contre cela .>finalfile.txt
après le,done
vous pouvez écraser au lieu d'ajouter, ce qui supprimera l'exigence de s'assurer que le fichier est manquant ou vide avant la boucle.Si vous avez suffisamment de fichiers pour pouvoir les lister, vous pouvez utiliser la substitution de processus dans Bash, en insérant une nouvelle ligne entre chaque paire de fichiers:
la source
Si c'était moi, j'utiliserais sed:
Dans ce modèle sed, $ a deux significations, premièrement, il correspond au dernier numéro de ligne uniquement (comme une plage de lignes sur laquelle appliquer un modèle) et deuxièmement, il correspond à la fin de la ligne dans le 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:la source
sed -s '$G' *.txt > finalfile.txt
find
à la place du*.txt
, ce qui signifiait que le fichier était ajouté sur lui-même!Vous pouvez le faire en utilisant
xargs
si vous le souhaitez, mais l'idée principale est toujours la même:la source
xargs
beaucoup plus facile à utiliser que les boucles en bash.Cela fonctionne dans Bash:
Contrairement aux réponses avec
>>
(append), 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 parents sont facultatifs)for ... done | less
(piping en moins)for ... done | head -n -1
(cela supprime la ligne vierge de fin)la source
C'est comme ça que je viens de le faire sur OsX 10.10.3
puisque la simple commande 'echo' sans paramètre n'a abouti à aucune nouvelle ligne insérée.
la source
En python, cela concatène avec des lignes vides entre les fichiers (le
,
supprime l'ajout d'une ligne vierge de fin supplémentaire):Voici le vilain python one-liner qui peut être appelé à partir du shell et imprime la sortie dans un fichier:
la source