¿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?

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

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)
}

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


-2
paste -d '\n' file1 file2 > file3

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


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