Dar formato al texto en columnas

11

Tengo un archivo con dos columnas como se muestra a continuación (ejemplo):

ARCHIVO 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

Necesito formatear esto y mi salida esperada debería ser:

ARCHIVO 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9
RAM
fuente
1
¿Dónde están las 2 columnas?
marzo
Ambas salidas parecen ser iguales. ¿Podría por favor dar más detalles sobre su pregunta?
2
¿Cómo se definen las columnas? ¿Hay una pestaña o algún otro carácter entre el nombre y el número? ¿Cómo podemos saber que Michael Rod 3son 2 columnas y no 3?
terdon
2
No, no publique imágenes de texto . Solo iba a copiar y pegar ese texto para poder ayudarte, y ahora no puedo.
Kusalananda
1
lo mismo que decían mmmint y terdon; ¿puede especificar, por ejemplo, que es la última columna la que debe sangrarse para permitir el ancho de la línea más larga?
Jeff Schaller

Respuestas:

18

Si la entrada hubiera sido solo dos columnas, habría sugerido usar column -t. Sin embargo, esto no funciona aquí, ya que la columnutilidad tratará cualquier número de espacios o pestañas como delimitadores de columna:

$ column -t file1
John     1      
Peter    2      
Michael  Rod  3 
Su       7      
Louise   9      

"Michael Rod" tiene dos columnas, de modo que una sola fila tiene una columna más que las otras filas, lo que desordena la salida.

Podemos solucionar esto insertando un carácter de tabulación antes de la última columna y luego dejemos columnusar (solo) eso como delimitador:

$ awk '{ $NF = "\t" $NF; print }' file1 | column -t -s $'\t'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9

En Awk, NFes el número de campos (columnas) y $NFson los datos en el último campo. El script que estoy usando simplemente modifica los datos del último campo al anteponer un carácter de tabulación, antes de imprimir la línea completa.

Si su shell no comprende $'\t', puede elegir otro personaje que no sea parte de los datos:

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
Kusalananda
fuente