
Normalmente lo uso column
para 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 column
o 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 column
no 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 -