
Normalmente uso column
para 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 column
ou 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 column
nã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 -