Imprimir tabla con columnas vacías para delimitadores consecutivos

Imprimir tabla con columnas vacías para delimitadores consecutivos

Normalmente lo uso columnpara convertir la entrada en una tabla, por ejemplo:

$ echo 'a\tb\tc\nd\te\tf' | column -t -s $'\t'
a  b  c
d  e  f

Sin embargo, colapsa las columnas vacías, por ejemplo:

$ echo 'a\tb\tc\nd\t\tf' | column -t -s $'\t'
a  b  c
d  f

En lugar de imprimir una columna vacía cuando hay delimitadores consecutivos. Esto es lo que me gustaría, usando columno no:

a  b  c
d     f

Respuesta1

Si utiliza GNU column:

-norte
De forma predeterminada, el comando de columna fusionará varios delimitadores adyacentes en un único delimitador cuando se utilice la opción -t; esta opción desactiva ese comportamiento. Esta opción es una extensión de Debian GNU/Linux.

printf 'a\tb\tc\nd\t\tf\n'  | column -t -n -s $'\t'

Producción:

a  b  c
d     f

Si GNU columnno está disponible, puedes usar sed para agregar un espacio (u otra cosa, por ejemplo, a -) entre las pestañas:

printf 'a\tb\tc\nd\t\tf\n'  | sed -e ':loop; s/\t\t/\t-\t/; t loop' | column -t -s $'\t'

Respuesta2

No pude encontrar la opción -n en la versión del comando de mi columna, así que la solucioné usando sed:

echo -e 'a\tb\tc\nd\t\tf' | sed 's/\t\t/\t \t/'| column -t -s $'\t'

Respuesta3

Para aquellos sin columna GNU (por ejemplo, MacOS): tenga cuidado con la primera y la última columna.Si la primera columna no es la más larga, habría un cambio. El bucle del guión no parecía ser necesario. Sugiero la siguiente tubería:| sed $'s/^\t/-\t/;s/\t\t/\t-\t/g;s/\t$/\t-/' | column -t

paste \
<(printf "a\nb\nc") \
<(printf "1\n2\n3\n4444\n5\n6") \
<(printf "d\ne\nf\ng\nh\ni\nj\nijkl\nk\nl") \
<(printf "X") \
\
| sed $'s/^\t/-\t/;s/\t\t/\t-\t/g;s/\t$/\t-/' | column -t
a  1     d     X
b  2     e     -
c  3     f     -
-  4444  g     -
-  5     h     -
-  6     i     -
-  -     j     -
-  -     ijkl  -
-  -     k     -
-  -     l     -

información relacionada