Comment puis-je copier le contenu d'un fichier texte et le coller dans un autre à partir d'une certaine ligne?

12

J'ai besoin de copier le contenu d'un fichier texte et de le coller dans un autre fichier texte. Le premier fichier texte contient 10 lignes de données et j'ai besoin qu'elles soient copiées dans le deuxième fichier texte à partir de la ligne numéro 5 (par exemple). Donc, dans le deuxième fichier texte, ces données doivent être écrites de la ligne 5 à la ligne 14. Comment cela peut-il être fait? Merci d'avance. Considérez-moi comme une recrue concernant Linux.

G. Paschalis
la source

Réponses:

9

headet tailsolution

Supposons que le fichier source soit appelé ~/aet que le fichier à insérer soit appelé ~/b. Nous allons mettre le fichier fusionné dans ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • Le chemin d'accès ~/est abrégé pour le /home/usernom de votre répertoire
  • la tête copie les cinq premières lignes du fichier adans un fichier nouvellement crééc
  • cat répertorie le contenu du fichier bet l'ajoute au fichierc
  • queue ajoute le fichier à apartir de la ligne 6 jusqu'à la fin du fichierc

Après vérification, renommer le fichier fusionné

Après avoir vérifié que le fichier cest correctement fusionné à partir des fichiers aet bnous renommerons cen autilisant:

mv ~/c ~/a
  • mvdéplace le fichier cdans le fichier a. Les données ne sont pas physiquement déplacées. Le fichier est simplement renommé, ce qui fait gagner du temps.
WinEunuuchs2Unix
la source
Merci pour votre réponse. Cela a très bien fonctionné. Mais existe-t-il une autre façon de procéder sans utiliser un troisième fichier texte?
G. Paschalis
Le troisième fichier peut être renommé en fichier source une fois terminé. J'ai pensé qu'il était préférable de pouvoir consulter le fichier en premier. Je vais ajouter les étapes supplémentaires à la réponse maintenant.
WinEunuuchs2Unix
Ou ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt
1
@JJoao C'est un bon résumé sur une seule ligne :) À des fins pédagogiques, je préfère utiliser la seule ligne par méthode de commande et les instructions imbriquées if. Cependant, pour copier et coller dans le terminal, j'adore les doublures!
WinEunuuchs2Unix
16

L'outil le plus simple ici pourrait être sed. Pour insérer b.txtdans a.txtaprès la 5ème ligne, vous pouvez écrire:

sed '5r b.txt' a.txt

sedlit le fichier spécifié comme argument ( a.txt) ligne par ligne. Toutes les lignes sont reproduites dans la sortie telles qu'elles sont apparues dans l'entrée, à moins qu'elles ne soient modifiées par une commande.

Il 5s'agit d'une adresse (numéro de ligne) à laquelle la commande suivante doit être exécutée. La commande que nous utilisons est r, qui prend un nom de fichier comme argument (ici b.txt), le lit complètement et l'insère dans la sortie après la ligne courante.

En l'état, cette sedligne de commande n'imprimera la sortie que sur le terminal, sans écrire dans aucun fichier. Vous pouvez soit le rediriger vers un nouveau fichier (pas l'un des fichiers d'entrée!) En utilisant la redirection de sortie de Bash:

sed '5r b.txt' a.txt > c.txt

Ou vous pouvez directement modifier le fichier d'entrée externe a.txten utilisant sedle -icommutateur de (pour "sur place"). Si vous l'écrivez en tant que -i.bak, il fera d'abord une copie de sauvegarde du fichier d'entrée d'origine avec le suffixe .bak:

sed -i '5r b.txt' a.txt

Un exemple:

$ cat a.txt 
January
February
March
April
May
October
November
December

$ cat b.txt 
June
July
August
September

$ sed '5r b.txt' a.txt
January
February
March
April
May
June
July
August
September
October
November
December
Byte Commander
la source
0

(Réutilisation d'un exemple élégant de @ByteCommander :)

awk '1; NR==5 {system("cat b.txt")}' a.txt

la source