¿Cómo puedo copiar el contenido de un archivo de texto y pegarlo en otro comenzando en una línea determinada?

12

Necesito copiar el contenido de un archivo de texto y pegarlo en otro archivo de texto. El primer archivo de texto tiene 10 líneas de datos y necesito que se copien en el segundo archivo de texto que comienza en la línea número 5 (por ejemplo). Entonces, en el segundo archivo de texto, esos datos deben escribirse de la línea 5 a la línea 14. ¿Cómo se puede hacer esto? Gracias por adelantado. Considérame un novato con respecto a Linux.

G. Paschalis
fuente

Respuestas:

9

heady tailsolución

Suponga que se llama ~/aal archivo fuente y se llama al archivo a insertar ~/b. Pondremos el archivo combinado en ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • La ruta ~/es breve para el /home/usernombre de su directorio
  • head copia las primeras cinco líneas de archivo aen un archivo recién creadoc
  • cat enumera el contenido del archivo by lo agrega al archivoc
  • tail agrega el archivo acomenzando en la línea 6 hasta el final del archivoc

Después de la verificación, cambie el nombre del archivo combinado

Después de verificar que el archivo cse ha fusionado correctamente de los archivos ay bcambiaremos el nombre ca ausar:

mv ~/c ~/a
  • mvmueve el archivo ca archivo a. Los datos no se mueven físicamente. El archivo simplemente se renombra, lo que ahorra tiempo.
WinEunuuchs2Unix
fuente
Gracias por su respuesta. Funcionó bien. Sin embargo, ¿hay otra manera de hacer esto sin usar un tercer archivo de texto?
G. Paschalis
El tercer archivo se puede renombrar al archivo de origen cuando haya terminado. Pensé que era mejor poder ver el archivo primero. Agregaré los pasos adicionales a la respuesta ahora.
WinEunuuchs2Unix
O ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt
1
@JJoao Ese es un buen resumen de una línea :) Para propósitos de enseñanza, prefiero usar una línea por método de comando y anidando declaraciones if. Sin embargo, para copiar y pegar en la terminal, me encantan los liners.
WinEunuuchs2Unix
16

La herramienta más fácil aquí podría ser sed. Para insertar b.txten a.txtdespués de la línea 5, se podría escribir:

sed '5r b.txt' a.txt

sedlee el archivo especificado como argumento ( a.txt) línea por línea. Todas las líneas se reproducen en la salida tal como aparecieron en la entrada, a menos que un comando las modifique.

La 5es una dirección (número de línea) en la que se ejecutará el siguiente comando. El comando que usamos es r, que toma un nombre de archivo como argumento (aquí b.txt), lo lee por completo y lo inserta en la salida después de la línea actual.

Tal como está arriba, esta sedlínea de comando solo imprimirá la salida al terminal, sin escribir en ningún archivo. Puede redirigirlo a un nuevo archivo (¡no a ninguno de los archivos de entrada!) Utilizando la redirección de salida de Bash:

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

O puede modificar directamente el archivo de entrada externo a.txtutilizando sedel -iinterruptor 's (para "en el lugar"). Si lo escribe como -i.bak, .bakprimero hará una copia de seguridad del archivo de entrada original con el sufijo :

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

Un ejemplo:

$ 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
fuente
0

(Reutilizando un ejemplo elegante de @ByteCommander :)

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

fuente