Como exibir colunas em arquivos separados por tabulação?

4

Eu tenho alguns arquivos separados por tabulações que consistem em um cabeçalho que é bastante ilegível por causa do comprimento diferente das entradas da tabela. Essencialmente, parece um pouco como

c1    c2    c3    c4
A    0    1.0231321321213    92
BBBBB    12321.00002131    19912132.    0
CC    0.0999813221321    0    0

Existe uma maneira de tornar isso mais legível com colunas espaçadas e colunas alinhadas a partir de colunas legíveis como

c1       c2                 c3                 c4
A        0                  1.0231321321213    92
BBBBB    12321.00002131     19912132.          0
CC       0.0999813221321    0                  0
    
por chrise 08.06.2018 / 06:45

1 resposta

3

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
    
por 08.06.2018 / 07:06