Establezca la alignment de columnas numéricas cuando se escriben datos

Utilizo column -t para formatear datos para una fácil visualización en el shell, pero parece que no hay ninguna opción para especificar la alignment de las columnas (por ejemplo, alinear a la derecha).

Cualquier Bash one-liners para hacerlo? Tengo un número arbitrario de columnas.

ACTUALIZACIÓN: agregó una secuencia de commands (no un trazador de líneas, sin embargo) que le permite elegir qué columnas desea justificar … Se adapta a la izquierda (pnetworkingeterminado) y derecha (no al centro) .. Tal como está, espera campos delimitados por tabuladores . Puede cambiar el separador de salida de columna a través de $ S.

 RJustCol=(2 3 5) # Set columns to be right justified. RJustRex=; Q=$'\x01'; R=$'\x02'; S=" | " for r in ${RJustCol[@]} ;do # Build the Right-justify regex. RJustRex="${RJustRex}s/^(([^\t]+\t){$((r-1))})([^\t]+)\t/\1\3$R\t/; " done sed -r "s/$/\tZ/g; s/^/$Q/; s/\t/\t$Q/g; $RJustRex" file | column -t -s $'\t' | sed -r "s/ $Q/$Q/g; s/$Q([^$Q$R]*)$R([^$Q]*)/$S\2\1/g; s/$Q/$S/g; s/Z$//" 

Salida típica:

 | The Lost Art | +1255 | 789 | Los | -55 | | of the Idle Moment | -159900 | 0123 | Fabulosos Cadillacs | +321987 | 

Nota: la column no funciona como podría esperar cuando tiene celdas vacías.

 Option -n By default, the column command will merge multiple adjacent delimiters into a single delimiter when using the --t option; this option disables that behavior. This option is a Debian GNU/Linux extension. 

De aquí en adelante está la respuesta original que está relacionada pero no aborda específicamente el tema principal de la pregunta.

Aquí está el "one-liner" que se adapta a los integers (y permite signos +/-). La column "X" del marcador de position obliga a la almohadilla derecha de la última celda.

 sed 's/$/\tX/g' file |column -t |sed -r 's/([-+]?[0-9.]+)( +)/\2\1/g; s/^ //; s/X$//' 

Salida típica

  +1255 789 011 -55 34 -159900 33 022 +321987 2323566 

Si tiene valores flotantes, o flotantes mezclados con numbers integers, o solo numbers integers, (signos de +/- principales), un poco más de mezcla funciona.

 sed -r 's/$/\tX/; s/([-+]?[0-9]+\.[0-9]+)\t/\1@\t/g s/([-+]?[0-9]+)\t/\1.@\t/g s/\./\t./g' file | column -t | sed -r 's/ \././g s/([-+]?[0-9.]+)( +)/\2\1/g s/\.@/ /g s/@//g s/ +X$//' 

Salida típica

 +1255 789 0.11 -55 34 -15.9900 33 0.22 +321.987 2323566 

Desde un punto simple, usaría awk

 column -t filename | awk '{for (i=0; i<NF; i++){l=index($0, $i)+1;printf "%*s ", index($0, $(i+1))-l, $i}printf "%*s\n", index($0, $NF)-l, $NF}' 

Esto hace un poco más amplio