Estoy editando una tabla simple. Me gustaría tener un buen formato. Si bien podría usar tbl
, latex
o similar, esto parece excesivo: el texto sin formato realmente es suficiente. Como es simple, también podría tener la fuente como la salida. Entonces la fuente también debería verse bien. Parece que debería ser un trabajo perfecto column -s '|' -t
: encuentra los separadores e inserta automáticamente espacios para alinearlos de acuerdo con el ancho máximo en cada columna. Desafortunadamente, elimina los separadores, por lo que no puedo volver a ejecutarlo después de una edición posterior. ¿Existe alguna buena herramienta de procesamiento de texto que pueda hacer esto de manera idempotente, de modo que su salida sirva como entrada? ¿O necesito escribir el mío?
EDITAR: aquí hay un ejemplo de lo que quiero:
foo | bar | baz
abc def | 12 | 23456
debe convertirse
foo | bar | baz
abc def | 12 | 3456
Cuando ' '
es tanto el separador como el espaciador, column -t
funciona bien. Pero mis artículos tienen espacios, así que no puedo usar eso. Tener los espaciadores distintos de los separadores complica las cosas. Creo que es útil que sean tratados como caracteres separadores cuando están al lado de los separadores, pero eso no es lo que column -s '|' -t
hace (aunque obviamente el comportamiento actual también es útil).
fuente
printf
holocausto cada vez, que he encontrado hasta ahora, es agregar un carácter único (like@
) en los datos y usarlo... | column -s@ -t
después.Respuestas:
No estoy seguro si entiendo bien cuál es su problema. Pero, ¿se puede resolver agregando un separador temporal adicional? por lo tanto, puede usar el segundo separador para marcar las separaciones, manteniendo intacto el separador original.
Vea este ejemplo donde agrego una "@" a cada una de las "|" entonces la entrada del comando de columna sería "xxx @ | aaaa". La columna procesará la "@" manteniendo la "|" intacto:
fuente
sed 's/ *| */@| /g'
en su lugarsed 's/ |/|/g'
después de lascolumn
correcciones, se agregaron los espacios adicionales. Ahora tenemos una solución que funciona lo suficientemente bien para mí. (. A pesar de que sería bueno si no dependía de un carácter adicional como esto ¿Qué pasa si uno no está disponible?)Esto no estaba disponible cuando hizo la pregunta, pero a partir de la versión 2.23
column
de leutil-linux
permite seleccionar el separador de salida a través deAsí que simplemente ejecuta:
fuente
util-linux
versión no está disponible en Ubuntu 18.04 (y probablemente otras distribuciones derivadas de Debain) en el momento de la escritura. Solo labsdmainutils
versión está disponible. Labsdmainutils
versión no admite el formato de salida.Aquí hay un script bash. No usa 'column -t`, y el separador se maneja exactamente como el IFS, porque es el IFS (o al menos, la versión interna de awk del IFS) ... El delimitador predeterminado es $' \ t '
Este script completa completamente el campo de la derecha.
'columna' no hace esto.
Al rellenar todas las columnas, este script se puede
modificar fácilmente para crear un marco de tabla también.
Nota. El archivo de entrada debe procesarse dos veces
('columna' también necesitaría hacer esto)
El primer paso es obtener los anchos máximos de columna.
El segundo paso es expandir los campos (por columna)
Se agregaron algunas opciones y se corrigió un error evidente (cambio de nombre de las variables :(
fuente
Eche un vistazo al complemento vim llamado Tabularize
fuente
Este es un ajuste de dos pasos en la respuesta de hmontoliu , que evita la necesidad de codificar el delimitador, adivinándolo a partir de los datos de entrada.
$d
.@
, según el comentario de PeterO .El código es una función que acepta un nombre de archivo o, de lo contrario, ingresa desde STDIN :
Salida de
algn foo
(o tambiénalgn < foo
):fuente
Idea usada de hmontoliu para implementar un comando simple:
Comentario:
${1:-,}
- es un primer argumento con,
por defectosed
inserta un símbolo intermedio ($interm
segundo argumento o~
por defecto)column
reemplaza el símbolo intermedio con espacios que alineansed
limpia los espacios redundantes después delcolumn
comandoEjemplo de uso:
También es bueno porque es idempotente: puede aplicarlo varias veces y obtener el mismo resultado (por ejemplo, cuando edita en vim y realinear).
fuente