combinar dos archivos de texto con agregar algún separador entre?


16

cat file1 file2combinará dos archivos de texto. Pero si quiero agregar un separador entre, como una o dos líneas ********************************, ¿tengo que abrir el primer archivo y agregar la línea al final, o abrir el segundo archivo y agregar la línea en la parte superior, y luego ejecutar el catcomando? ¿Se puede hacer con solo ejecutar un comando?

Respuestas:


17

En bashy zshpuedes hacer:

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

o como mikeserv indicó en su comentario (en cualquier shell):

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

y en Bash como David Z comentó:

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

Se mostrarán las líneas nuevas en los archivos. Si no desea una nueva línea después del "separador" (por ejemplo, en caso de que file2comience con una nueva línea), puede usarla echo -n '****', así que suprima la nueva línea después de *.


77
puedes hacer lo mismo en cualquier shell comoecho '**********************' |cat file - file2
mikeserv

Gracias. ¿Cat siempre agrega una nueva línea entre archivos, implícitamente?
StackExchange for All

1
@Tim: definitivamente echosiempre lo hace.
mikeserv

1
@Tim - no se ve así aquí, pero compruébelo usted mismo - printf 'no newline' | tee file1 >file2; printf 'no newline' | cat file1 - file2
compruébalo

1
@Tim que puede usar ...<(echo -n '****')para suprimir la nueva línea del eco. catsolo muestra uno cuando el archivo tiene uno (al final).
Anthon

6

Otro enfoque sin usar catcomo se encuentra desde aquí ,

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

La sed 1dtubería final es eliminar la primera línea que también tendrá el delimitador.

Sin embargo, el seduso final bien podría evitarse si utilizamos el comando como lo sugiere 1_CR en sus comentarios.

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

1
puedes evitarlo sedcambiando el awkpatrón aFNR == 1 && NR != 1
iruvar

¡Felicitaciones por llegar a 10K!
G-Man dice 'Restablecer a Monica' el

@ G-Man, muchas gracias. Es muy amable de su parte felicitar :)
Ramesh

Esto permite una extensión fácil para regex de patrones de archivo
Paul

3

También puede dividirlo en múltiples comandos:

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

Y puede canalizar o redirigir eso usando un comando de grupo o un subshell:

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

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

Por supuesto, puede escribir eso sobre varias líneas en lugar de usar punto y coma, como de costumbre. Y es fácil de extender a otro archivo con otro delimitador, etc.


2

Con paste:

$ echo '********************************' | paste -sd$'\n' file1 - file2
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.