Como expandir as abas com base no conteúdo?

5

Eu tenho alguns dados delimitados por tabulações saindo de um pipe Unix. Gostaria de formatar esses dados em uma tabela compacta legível por humanos.

Como posso expandir essas guias em espaços e definir automaticamente as paradas de tabulação com base na largura dos dados do campo?

Por exemplo, meu script generate_tsv hipotético pode produzir (estou usando \t para representar caracteres de tabulação reais) -

alpha\t1\t0.21085026\tok
beta\t4096\t0.0\tok
gamma\t\t-1.0\tinvalid

Usando | expand -t 12 , recebo:

alpha       1           0.21085026  ok
beta        4096        0.0         ok
gamma                   -1.0        invalid

Mas eu gostaria de algo mais compacto (então há exatamente dois espaços separando colunas), assim:

alpha  1     0.21085026  ok
beta   4096  0.0         ok
gamma        -1.0        invalid

Como sugerido por @ jw013, | column -t -s $'\t' está próximo, mas não está correto, pois recolhe a célula vazia:

alpha  1     0.21085026  ok
beta   4096  0.0         ok
gamma  -1.0  invalid
    
por smokris 09.02.2012 / 03:55

2 respostas

5

Se você tiver column(1) , uma antiga ferramenta BSD, experimente column -t , para tabelas de impressão bonita.

Para garantir que as células vazias sejam exibidas, você pode tentar a abordagem de inserir um único espaço em cada célula vazia (reconhecível por duas guias consecutivas). A idéia é column(1) deve dar ao caractere de espaço sua própria coluna, mas sendo um único caractere em largura, isso não deve afetar as dimensões da tabela ou ser visível na saída para humanos.

generate_tsv | 
   awk '/\t\t/ { for (i = 0; i < 2; i++) gsub(/\t\t/, "\t \t") } 1' | 
   column -t -s $'\t'

O awk extra inserido no pipeline faz a inserção de espaços em cada célula vazia, conforme descrito. São necessários 2 passes para manipular 2 células vazias consecutivas ( \t\t\t ).

    
por 09.02.2012 / 04:13
4

Esta é uma maneira indireta de fazer isso, mas funciona e possui alguns recursos não encontrados em column .
Tabula levando em consideração linhas vazias e células vazias.
Pode juntar vários arquivos, lado a lado. por exemplo. Prefixar linhas de "F1" com linhas de "Nb"
Linhas em branco são exibidas como células vazias (para colar com vários arquivos)
Os arquivos podem ter comprimentos diferentes.

# Make test data file    
echo -e "alpha\t1\t0.21085026\tok
beta\t4096\t0.0\tnext F1 line is blank

gamma\t\t-1.0\tinvalid" >F1
sed -n '=' F1 >Nb
echo -e "\tB\tC\textra F1 line" >>F1

# Set the positional parameters $1, $2
set Nb F1  
{ echo -e "<html>\n<table border=1 cellpadding=0 cellspacing=0>"
  paste "$@" |sed -e 's#\(.*\)#\x09\x09#
                      s#\x09# </pre></td>\n<td><pre> #g
                      s#^ </pre></td>#<tr>#
                      s#\n<td><pre> $#\n</tr>#'
  echo -e "</table>\n</html>"
}|w3m -dump -T 'text/html'

A saída da versão tabulada:

┌───┬───────┬──────┬────────────┬───────────────────────┐
│ 1 │ alpha │ 1    │ 0.21085026 │ ok                    │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 2 │ beta  │ 4096 │ 0.0        │ next F1 line is blank │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 3 │       │      │            │                       │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 4 │ gamma │      │ -1.0       │ invalid               │
├───┼───────┼──────┼────────────┼───────────────────────┤
│   │       │ B    │ C          │ extra F1 line         │
└───┴───────┴──────┴────────────┴───────────────────────┘

Para obter uma versão sem frames, é necessário apenas remover o quadro. Isso é feito facilmente canalizando a saída um passo adiante, como mostrado pela linha de código a seguir, que é uma substituição para a última linha da versão tabulada acima.

# the replacement "new" last line
}|w3m -dump -T 'text/html' |sed -r '/^┌|├|└/d; s/^│ //g; s/ │$//g; s/ │ /│/g' 

Aqui está a saída "nova": deixei os divisores verticais no lugar. Se você não quiser, apenas mude a última expressão sed para o que quiser.

1│alpha│1   │0.21085026│ok                   
2│beta │4096│0.0       │next F1 line is blank
3│     │    │          │                     
4│gamma│    │-1.0      │invalid              
 │     │B   │C         │extra F1 line        

ou, substituindo o / │ / por / / (2 espaços), parece isso.

1  alpha  1     0.21085026  ok                   
2  beta   4096  0.0         next F1 line is blank
3                                                
4  gamma        -1.0        invalid              
          B     C           extra F1 line        

E, é claro, os números principais estão lá apenas para demonstrar o arquivo "colar" lado a lado.

    
por 09.02.2012 / 06:28