Imprimir tabela com colunas vazias para delimitadores consecutivos

Imprimir tabela com colunas vazias para delimitadores consecutivos

Normalmente uso columnpara converter a entrada em uma tabela, por exemplo:

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

No entanto, ele recolhe colunas vazias, por exemplo:

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

Em vez de imprimir uma coluna vazia quando houver delimitadores consecutivos. Isso é o que eu gostaria, usando columnou não:

a  b  c
d     f

Responder1

Se você usar GNU column:

-n
Por padrão, o comando de coluna mesclará vários delimitadores adjacentes em um único delimitador ao usar a opção -t; esta opção desativa esse comportamento. Esta opção é uma extensão do Debian GNU/Linux.

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

Saída:

a  b  c
d     f

Se GNU columnnão estiver disponível, você pode usar sed para adicionar um espaço (ou outra coisa, por exemplo, a -) entre as abas:

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

Responder2

Não consegui encontrar a opção -n na versão do comando da minha coluna, então corrigi-a usando sed:

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

Responder3

Para aqueles sem coluna GNU (por exemplo, MacOS): tenha cuidado com a primeira e a última coluna.Se a primeira coluna não for a mais longa, haveria uma mudança. O loop no script não parecia ser necessário. Sugiro o seguinte tubo:| 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     -

informação relacionada