Tengo los siguientes dos archivos (rellené las líneas con puntos para que cada línea de un archivo tenga el mismo ancho y puse file1 todo en mayúsculas para que quede más claro).
contents of file1:
ETIAM......
SED........
MAECENAS...
DONEC......
SUSPENDISSE
contents of file2
Lorem....
Proin....
Nunc.....
Quisque..
Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Observe que file2 es más largo que file1.
Cuando ejecuto este comando:
paste file1 file2
Me sale esta salida
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
¿Qué puedo hacer para que la salida sea la siguiente?
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Lo intenté
paste file1 file2 | column -t
pero hace esto:
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
no tan feo como el resultado original pero de todos modos incorrecto en columnas.
text-processing
columns
paste
Tulains Córdova
fuente
fuente

pasteestá usando pestañas delante de las líneas del segundo archivo. Puede que tenga que usar un postprocesador para alinear las columnas de manera adecuada.paste file1 file2 | column -tn?Respuestas:
Suponiendo que no tiene caracteres de tabulación en sus archivos,
con el argumento
-telegido adecuadamente para cubrir el ancho de línea máximo deseado en el archivo1.OP ha agregado una solución más flexible:
Hice esto para que funcione sin el número mágico 13:
No es fácil de escribir, pero se puede usar en un script.
fuente
Pensé que awk podría hacerlo bien, así que busqué en Google "awk leyendo la entrada de dos archivos" y encontré un artículo sobre stackoverflow para usar como punto de partida.
Primero está la versión condensada, luego comentamos completamente debajo. Esto tardó más de unos minutos en resolverse. Me alegraría algunos refinamientos de personas más inteligentes.
Y aquí está la versión completamente documentada de lo anterior.
fuente
No es una muy buena solución, pero pude hacerlo usando
donde TAB se reemplaza con el carácter de tabulación.
fuente
&&comando sed?&pone lo que se está buscando (una pestaña en este caso). Este comando simplemente reemplaza la pestaña al principio con dos pestañas.TABpara\thacer que esto funcione en zsh en Ubuntu Debian. Y solo funciona si el archivo 1 tiene menos de 15 caracteresEn Debian y derivados,
columntiene una opción de-nnomerge que permite a la columna hacer lo correcto con campos vacíos. Internamente,columnutiliza lawcstok(wcs, delim, ptr)función, que divide una cadena de caracteres anchos en tokens delimitados por los caracteres anchos en eldelimargumento.wcstokcomienza saltando caracteres anchosdelimantes de reconocer el token. La-nopción utiliza un algoritmo que no omite los caracteres anchos inicialesdelim.Desafortunadamente, esto no es muy portátil:
-nes específico de Debian, ycolumnno está en POSIX, aparentemente es algo BSD.fuente
Sacando los puntos que usaste para el relleno:
archivo1:
file2:
Prueba esto:
Y obtendrás:
fuente
paste, no imprimirá el resultado adecuado si hay líneas que contengan pestañas. +1 por ser diferente, sin embargoUna
awksolución que debería ser bastante portátil y debería funcionar para un número arbitrario de archivos de entrada:fuente
paste-awky lo intentépaste file1 file2|paste-awky lo intentéawk paste-awk file1 file2pero ninguno funcionó.awk: Line:1: (FILENAME=file1 FNR=1) Fatal: Division by zeroawk -f paste-awk file1 file2debería funcionar, al menos para GNU awk y mawk.pasteya que hay menos espacio entre las dos filas. Y si el archivo de entrada no tiene todas las filas de la misma longitud, dará como resultado una fila de alineación a la derecha-F\\t