¿Cómo leer simultáneamente dos archivos e imprimirlos línea por línea, bash?

¿Cómo leer simultáneamente dos archivos e imprimirlos línea por línea, bash?

Quiero escribir un script que tenga como argumentos dos archivos F1 y F2 y los imprima alternativamente; primero se escribirá la primera línea de F1, luego F2'2 la segunda línea y así sucesivamente. Si uno de ellos tiene menos líneas que el otro, cuando terminemos de imprimir el más corto, el guión deberá escribir el más largo hasta el final.

Mi idea era:

1) Verifique si no hay 2 argumentos -> hacer eco y salir 2) Verificar si F1 o F2 no son archivos -> hacer eco y salir 3) Cuerpo:

exec 3 < $1
exec 4 < $2
i=0
j=1
while read -u 3 line && ((i==0))
do
echo line; echo
 ((i++))
((j--))
    while read -u 4 line && ((j==0))
    do
        echo line; echo
 ((j++))
((i--))
   done
 done
 exit $?

Duda: Esto solo funcionaría si ambos archivos tienen el mismo número de líneas. ¿Cómo puedo mejorar esto para extender esta solución a archivos de diferentes tamaños?

Respuesta1

No es necesario un script de shell. Puedes hacer esto directamente con paste, que esespecificado por POSIX:

paste -d '\n' file1 file2

Sin embargo, no maneja diferentes recuentos de líneas de la forma que usted describe. Para citar las especificaciones:

Si se detecta una condición de fin de archivo en uno o más archivos de entrada, pero no en todos los archivos de entrada,pegarse comportará como si se leyeran líneas vacías de los archivos en los que se detectó el fin de archivo....

Personalmente, creo que sería un error comportarse como lo describe en su pregunta. Al observar la línea 24 del resultado, no podrá saber si proviene de file1o file2. Con el comportamiento real de paste, sabrías de dónde proviene file2, ya que es un número de línea par de la salida.

Puede canalizar la salida de tr -s '\n'esta manera:

paste -d '\n' file1 file2 | tr -s '\n'

Pero, si hayactuallíneas en blanco en cualquiera de los archivos, no obtendrá los resultados esperados.

información relacionada