combiner deux fichiers texte en ajoutant un séparateur entre?


16

cat file1 file2combinera deux fichiers texte. Mais si je veux ajouter un séparateur entre, comme une ligne ou deux ********************************, dois-je ouvrir le premier fichier et ajouter la ligne à sa fin, ou ouvrir le deuxième fichier et ajouter la ligne en haut, puis exécuter la catcommande? Peut-on le faire en exécutant simplement une commande?

Réponses:


17

Dans bashet zshvous pouvez faire:

cat file1 <(echo '********************************') file2

ou comme mikeserv l'a indiqué dans son commentaire (dans n'importe quel shell):

echo '********************************' | cat file1 - file2

et dans Bash comme David Z a commenté:

cat file1 - file2 <<< '********************************'

Toutes les nouvelles lignes dans les fichiers seront affichées. Si vous ne voulez pas de nouvelle ligne après le "séparateur" (par exemple au cas où file2commence par une nouvelle ligne), vous pouvez utiliser echo -n '****', donc supprimez la nouvelle ligne après le *.


7
vous pouvez faire la même chose dans n'importe quel shellecho '**********************' |cat file - file2
mikeserv

Merci. chat ajoute-t-il toujours une nouvelle ligne entre les fichiers, implicitement?
StackExchange for All

1
@Tim - définitivement echotoujours.
mikeserv

1
@Tim - ne ressemble pas à ça ici, mais voyez par vous-même -printf 'no newline' | tee file1 >file2; printf 'no newline' | cat file1 - file2
mikeserv

1
@Tim vous pouvez utiliser ...<(echo -n '****')pour supprimer la nouvelle ligne de l'écho. catn'en affiche qu'un lorsque le fichier en a un (à la fin).
Anthon

6

Une autre approche sans utiliser catcomme trouvé d' ici ,

awk 'FNR==1{print "******"}{print}' file1 file2 | sed '1d'

Le dernier sed 1dtuyau consiste à supprimer la première ligne qui aura également le délimiteur.

Cependant l' sedutilisation finale pourrait très bien être évitée si nous utilisons la commande comme suggéré par 1_CR dans ses commentaires.

awk 'FNR==1 && NR!=1 {print "******"}{print}' file1 file2

1
vous pouvez éviter cela seden changeant de awkmodèle pourFNR == 1 && NR != 1
iruvar

Félicitations pour avoir atteint 10 km!
G-Man dit `` Réintègre Monica ''

@ G-Man, merci beaucoup. C'est si gentil de votre part de vous féliciter :)
Ramesh

Cela permet une extension facile pour regex des modèles de fichiers
Paul

3

Vous pouvez également le diviser en plusieurs commandes:

cat file1; echo '------------'; cat file2

Et vous pouvez diriger ou rediriger cela à l'aide d'une commande de groupe ou d'un sous-shell:

# GROUP COMMAND:
{ cat file1; echo '----------'; cat file2; } | other-command
#                                        ^ final semicolon is part of the syntax!

# SUBSHELL:
( cat file1; echo '----------'; cat file2 ) | other-command

Bien sûr, vous pouvez écrire cela sur plusieurs lignes au lieu d'utiliser des points-virgules, comme d'habitude. Et il est facile d'étendre à un autre fichier avec un autre délimiteur, etc.


2

Avec paste:

$ echo '********************************' | paste -sd$'\n' file1 - file2
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.