Tengo tres archivos que contienen una secuencia ordenada de números, uno por línea:
archivo1
1
2
3
archivo2
1
3
4
file3
1
5
Quiero "alinear" estos tres archivos uno al lado del otro de la siguiente manera:
file1 file2 file3
1 1 1
2
3 3
4
5
Lo he intentado sdiff
pero solo funciona con 2 archivos
text-processing
awk
diff
Cheseaux
fuente
fuente
diff3
?diff3
no tiene ese formato de salida.diff3
y como @Kusalananda dijo correctamente, no produce esa salida. Además, estoy buscando una solución genérica (para n archivos, n> 2)5
está en la quinta línea como resultado en lugar de la tercera?Respuestas:
Puede procesar cada archivo e imprimir una línea con algún carácter, por ejemplo,
X
para cada número faltante en la secuencia 1- max (donde max es el último número en ese archivo),paste
los resultados luego reemplazan ese carácter con espacio:Si falta un cierto valor en todos los archivos, obtendrá líneas vacías en su salida (en realidad no están vacías, solo contienen espacios en blanco).
Para eliminarlos, reemplácelos
tr X ' '
consed '/[[:digit:]]/!d;s/X/ /g'
Además, si necesita un encabezado, siempre puede ejecutar algo como esto primero:fuente
;1
embargo, me costó descubrir qué significaba la parte al final. Estoy usando en su{print $0}
lugar, un poco menos críptico en mi humilde opinión. De todos modos, gracias de nuevoUna solución general con awk: requiere GNU awk
Tomó un enfoque diferente y más simple para esto basado en el comentario de Don:
fuente
Una solución con
bash
,join
,paste
, y el mal gusto:Excepto por el último
sort -n
, todo esto funciona con cualquier elemento de texto en lugar de números, siempre que los elementos no contengan pestañas (peroTAB
se pueden cambiar a cualquier otro separador). Además, podría hacerse con solo 3 archivos temporales y algunas cosas que se barajan (pero eso solo aumentaría el mal sabor).fuente