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
paste
está 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
-t
elegido 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.TAB
para\t
hacer que esto funcione en zsh en Ubuntu Debian. Y solo funciona si el archivo 1 tiene menos de 15 caracteresEn Debian y derivados,
column
tiene una opción de-n
nomerge que permite a la columna hacer lo correcto con campos vacíos. Internamente,column
utiliza lawcstok(wcs, delim, ptr)
función, que divide una cadena de caracteres anchos en tokens delimitados por los caracteres anchos en eldelim
argumento.wcstok
comienza saltando caracteres anchosdelim
antes de reconocer el token. La-n
opción utiliza un algoritmo que no omite los caracteres anchos inicialesdelim
.Desafortunadamente, esto no es muy portátil:
-n
es específico de Debian, ycolumn
no 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
awk
solución que debería ser bastante portátil y debería funcionar para un número arbitrario de archivos de entrada:fuente
paste-awk
y lo intentépaste file1 file2|paste-awk
y lo intentéawk paste-awk file1 file2
pero ninguno funcionó.awk: Line:1: (FILENAME=file1 FNR=1) Fatal: Division by zero
awk -f paste-awk file1 file2
debería funcionar, al menos para GNU awk y mawk.paste
ya 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