Cómo intercalar líneas desde dos archivos de texto

¿Cuál es la forma más fácil / más rápida de intercalar las líneas de dos (o más) archivos de texto? Ejemplo:

Archivo 1:

line1.1 line1.2 line1.3 

Archivo 2:

 line2.1 line2.2 line2.3 

Intercalado:

 line1.1 line2.1 line1.2 line2.2 line1.3 line2.3 

Claro que es fácil escribir un pequeño script de Perl que los abra a los dos y haga la tarea. Pero me preguntaba si es posible salirse con la suya con menos códigos, tal vez con un solo trazador usando las herramientas de Unix.

 paste -d '\n' file1 file2 

Aquí hay una solución usando awk :

 awk '{print; if(getline < "file2") print}' file1 

produce esta salida:

 line 1 from file1 line 1 from file2 line 2 from file1 line 2 from file2 ...etc 

Usar awk puede ser útil si desea agregar algún formato adicional a la salida, por ejemplo, si desea etiquetar cada línea según el archivo del que proviene:

 awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1 

produce esta salida:

 1: line 1 from file1 2: line 1 from file2 1: line 2 from file1 2: line 2 from file2 ...etc 

Nota: este código supone que el archivo1 es de mayor o igual longitud que el archivo2.

Si el archivo1 contiene más líneas que el archivo2 y desea generar líneas en blanco para el archivo2 después de que termine, agregue una cláusula else a la prueba getline:

 awk '{print; if(getline < "file2") print; else print ""}' file1 

o

 awk '{print "1: "$0; if(getline < "file2") print "2: "$0; else print"2: "}' file1 

@ La respuesta de Sujoy apunta en una dirección útil. Puede agregar números de línea, ordenar y quitar los números de línea:

 (cat -n file1 ; cat -n file2 ) | sort -n | cut -f2- 

Nota (de mi interés) esto necesita un poco más de trabajo para obtener el orden correcto si, en lugar de archivos estáticos, utiliza la salida de comandos que pueden ejecutarse más despacio o más rápido que el otro. En ese caso, necesita agregar / ordenar / eliminar otra etiqueta además de los números de línea:

 (cat -n < (command1...) | sed 's/^/1\t/' ; cat -n <(command2...) | sed 's/^/2\t/' ; cat -n <(command3) | sed 's/^/3\t/' ) \ | sort -n | cut -f2- | sort -n | cut -f2- 

Aquí hay una forma de GUI para hacerlo: Pegarlos en dos columnas en una hoja de cálculo, copiar todas las celdas, luego usar expresiones regulares para reemplazar las tabs con líneas nuevas.

 cat file1 file2 |sort -t. -k 2.1 

Aquí se especifica que el separador es “.” y que estamos ordenando el primer personaje del segundo campo.