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