2010-04-05 23 views
23

Estoy usando cat * .txt para fusionar varios archivos txt en uno, pero necesito que cada archivo esté en una línea separada.Linux: fusionando varios archivos, cada uno en una nueva línea

¿Cuál es la mejor manera de combinar archivos con cada archivo que aparece en una nueva línea?

+0

'cat' hace que por defecto. –

+7

@Dennis Williamson: No, no es así. Pruebe 'echo -n a> a.txt; echo -n b> b.txt; cat a.txt b.txt'. – ephemient

+0

@ephemient: 'echo" some text "> text.txt; archivo text.txt; echo -n "some text"> text.txt; archivo text.txt' –

Respuesta

35

sólo tiene que utilizar awk

awk 'FNR==1{print ""}1' *.txt 
+1

Me encanta esto. Lo adapté para producir un comentario, así puedo decir de qué archivo proviene cada sección del nuevo archivo: awk 'FNR == 1 {printf ("#% s \ n", ARGV [ARGIND])} 1' Gracias por presentarme yo a awk. Estoy combinando archivos .coffee para poder evitar la fusión del café y así obtener un mapa fuente funcional. – Julian

+1

Sugeriría la siguiente edición para no incluir un salto de línea en la parte superior de los resultados: 'awk 'FNR == 1 && NR! = 1 {print" "} 1' * .txt' –

7
for file in *.txt 
do 
    cat "$file" 
    echo 
done > newfile 
17

Se puede recorrer cada archivo con un bucle for:

for filename in *.txt; do 
    # each time through the loop, ${filename} will hold the name 
    # of the next *.txt file. You can then arbitrarily process 
    # each file 
    cat "${filename}" 
    echo 

# You can add redirection after the done (which ends the 
# for loop). Any output within the for loop will be sent to 
# the redirection specified here 
done > output_file 
+1

Esto ahogará los archivos que tienen un espacio en el nombre del archivo. –

+0

@IgnacioVazquezAbrams - gracias por el recordatorio (no uso espacios en mis nombres, así que generalmente me olvido de eso). De todos modos, he actualizado mi ejemplo para manejarlo correctamente. –

+0

Elegí la solución awk, pero esto definitivamente será útil para otras secuencias de comandos. Gracias. – Marco

6

Asumo desea un salto de línea entre archivos.

for file in *.txt 
do 
    cat "$file" >> result 
    echo >> result 
done 
23

Si usted tiene un paste que lo soporta,

paste --delimiter=\\n --serial *.txt 

hace un muy buen trabajo

+2

Este es uno de los métodos más rápidos de archivo concatenación que alguna vez he probado. Gran idea ... – retrography

+0

Mejor solución de IMO. Tanto '-d' como' -s' están especificados en posix, por lo que no debería haber un 'paste' que no los soporte. Esta solución realmente necesita más votos. – kralyk

+0

+1 excelente! un millón de gracias. pregunta exacta que tuve y los ans perfectos! – KillBill

Cuestiones relacionadas