es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo elijo dónde se va a guardar la salida en un archivo?

Tengo un archivo como este:

file1:
a aa 
b bb
c cc
file 2: 
d dd ddd
e ee eee

Quiero mostrar el contenido de file2 en file1, en la línea con el patrón que elija, antes de la línea con “a” y después de la línea con “b”, de esta manera:

file 1:
d dd ddd
a aa 
b bb
e ee eee
c cc

Solo sé cómo usar “puts” en Tcl o “>>” con “echo” en csh, pero solo muestran la salida en la última línea.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes seguir los siguientes pasos:

    1. Leer el contenido del archivo1 en una lista en Tcl.
    2. Abrir el archivo2 y leer su contenido línea por línea.
    3. Insertar cada línea del archivo2 en la línea deseada de la lista obtenida del archivo1.
    4. Escribir la lista actualizada en el archivo1.

    Aquí tienes un código de ejemplo en Tcl para lograr esto:

    # Leer el archivo1 en una lista
    set f1 [open "archivo1" r]
    set lineas [split [read $f1] "\n"]
    close $f1
    
    # Abrir el archivo2 para leer
    set f2 [open "archivo2" r]
    
    # Iterar a través de cada línea del archivo2
    while {[gets $f2 linea] != -1} {
      # Encontrar el índice de la línea antes o después de la cual insertar esta línea
      set idx [lsearch -exact $lineas "a aa"]
      set antes [expr $idx-1]
      set idx [lsearch -exact $lineas "b bb"]
      set despues [expr $idx+1]
    
      # Insertar esta línea en el índice deseado
      set lineas [linsert $lineas $despues $linea]
    }
    
    close $f2
    
    # Escribir la lista actualizada en el archivo1
    set f1 [open "archivo1" w]
    puts $f1 [join $lineas "\n"]
    close $f1
    

    En csh, puedes usar el comando sed para lograr el mismo resultado:

    # Insertar el contenido del archivo2 después de la línea que contiene "a aa"
    sed -i '/a aa/G' archivo1
    sed -i '/a aa/{n;s/^/d dd ddd\n/}' archivo1
    
    # Insertar el contenido del archivo2 antes de la línea que contiene "b bb"
    sed -i '/b bb/G' archivo1
    sed -i '/b bb/{s/^/e ee eee\n/}' archivo1
    

    El primer comando sed agrega una nueva línea y el contenido del archivo2 después de la línea que contiene “a aa”. El segundo comando sed busca la línea que contiene “a aa”, pasa a la siguiente línea (n) e inserta el contenido del archivo2 antes de esa línea. El comando G agrega una nueva línea y el contenido de la memoria intermedia después de la línea actual, efectivamente insertando el contenido del archivo2. El mismo enfoque se puede usar para insertar el contenido del archivo2 antes de la línea que contiene “b bb”. La opción -i indica a sed que modifique el archivo directamente.

Comments are closed.