Se as colunas de entrada forem separadas por um espaço em branco simples (espaço ASCII 0x20 e / ou guia 0x09) e nenhuma coluna em branco, será tão simples quanto:
<infile column -t
c1 c2 c3 c4
ABC 0 1.0231321321213 92
BBBBB 12321.00002131 19912132. 0
CC 0.0999813221321 0 0
No entanto, column
não processa Retorno de carro (ASCII 0x0d ou \r
), Alimentação de formulário (ASCII 0x0c ou \f
) ou Guia vertical (ASCII 0x0b ou \v
) como delimitadores.
Se as colunas puderem ser separadas por algum "espaço em branco" ( [[:space:]]
semelhante a [ \t\r\f\v]
: espaço, tabulação horizontal, retorno de carro, alimentação ou tabulação vertical (não newline)) você precisará recolher (e converter) todo o branco espaço para apenas um delimitador (espaço por padrão). Não é possível usar o caractere de nova linha como um delimitador de linha e como um delimitador de coluna.
Com exceção do caractere de nova linha, este trabalho:
<infile sed 's/[[:space:]]\+/ /g' | column -t
É possível reduzir os delimitadores de espaço em branco dentro do intervalo […]
.
Se as colunas no arquivo de origem forem separadas por um único caractere (como guias), é possível usar a expansão shell ANSI C ( $'…'
) (se o shell em execução tiver esse recurso) para declarar o caractere usado como delimitador
Então, usando column
:
<infile column -s $'\t' -t
O delimitador de saída da coluna é sempre um espaço.
Se for necessário aceitar vários delimitadores consecutivos (útil quando houver coluna em branco), existe a opção (GNU) -n
que desabilita a fusão de vários delimitadores adjacentes de entrada em um único delimitador.
<infile column -s $'\t' -tn
se o arquivo de origem for separado com não apenas um caractere, mas vários caracteres, você ainda poderá defini-los dentro de $'...'
sem uso adicional de sed
para convertê-los em único caractere; como Space ou Tabs com:
<infile column -s $'\t ' -tn