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?

StackExchange para todos
fuente

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 *.

Anthon
fuente
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
Ramesh
fuente
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.

derobert
fuente
2

Con paste:

$ echo '********************************' | paste -sd$'\n' file1 - file2
Cuonglm
fuente