¿Cómo intercalar las líneas de dos o más archivos?

10

Intenté obtener los 2 archivos de salida en un solo archivo. He intentado debajo del comando:

cat file1 file2

pero aquí file2se adjuntan datos file1.

Lo que necesito es la file1primera línea seguida de la file2primera línea y la file1segunda línea seguida de la file2segunda línea, etc.

¿Alguien puede decirme cómo hacer esto de una manera simple?

usuario73553
fuente

Respuestas:

17

¡Hay una aplicación para eso!

$ cat file1
file1 line1
file1 line2

$ cat file2
file2 line1
file2 line2

Ahora, si pasa estos archivos como argumentos a paste:

$ paste -d' ' file1 file2
file1 line1 file2 line1
file1 line2 file2 line2

Si por "archivo1 primera línea seguido de archivo2 primera línea y archivo1 segunda línea seguido de archivo2 segunda línea, etc.", quiere decir que desea una nueva línea entre cada línea pegada, simplemente ajuste la -dopción (delimitador).

$ paste -d'\n' file1 file2
file1 line1
file2 line1
file1 line2
file2 line2
terdon
fuente
2

POSIX Awk; esto funciona con una cantidad arbitraria de archivos, y los archivos ni siquiera tienen que tener la misma cantidad de líneas. El script continúa hasta que todos los archivos estén fuera de línea:

BEGIN {
  do {
    br = ch = 0
    while (++ch < ARGC)
      if (getline < ARGV[ch]) {
        printf ch < ARGC - 1 ? $0 FS : $0 RS
        br = 1
      }
  } while (br)
}
Steven Penny
fuente
Hay un problema con él, si la entrada contiene caracteres '%', intentó evaluarlos dentro de printf. Mi actualización sería (no estoy seguro de que esto sea perfectamente correcto):printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)
Scala William
0

Solución de golpe rápido

# Takes as many file arguments as needed
function InterleaveFiles {

    local counter=0
    local hasLine=true

    while [ $hasLine == true ]; do
            hasLine=false
            for i in "$@"; do
                    line=$(awk 'NR == num_line {print; exit}' num_line=$((counter+1)) "$i")
                    if [ -n "$line" ]; then
                            echo "$line"
                    hasLine=true
                    fi
            done
            counter=$((counter+1))
    done
}

InterleaveFiles archivo1 archivo2 archivo3 archivo4

Orsiris de Jong
fuente
-2
paste -d '\n' file1 file2 > file3

donde file1y file2son los archivos de entrada y file3serán la salida creada.

Prateek Singh
fuente
1
¡Bienvenido a U&L Stack Exchange! Esta respuesta es casi idéntica a la respuesta de terdon . En los casos en que cree que puede mejorar una respuesta, pero no proporciona información sustancialmente nueva, considere proponer una edición a una respuesta existente . Las respuestas también se reordenan en función de la votación, por lo que cada respuesta debe ser independiente o referirse a otra respuesta. Es por eso que los forros de concha deben ir acompañados de una descripción que explique su funcionamiento.
Thomas Nyman