comando para lista de layout separada lista bem

33

Às vezes, estou chegando como uma lista separada por tabulações de entrada, que não está bem alinhada, por exemplo

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

Existe uma maneira fácil de torná-los alinhados?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3
    
por Elazar Leibovich 20.02.2011 / 09:45

5 respostas

46

Então, a resposta é:

column -t file_name

Observe que isso divide as colunas em qualquer espaço em branco, não apenas nas guias. Se você quiser dividir apenas nas guias, use:

column -t -s $'\t' -n file_name

O -s $'\t' define o delimitador apenas para guias e -n preserva colunas vazias (guias adjacentes).

P.S .: Só quero salientar que o crédito vai para Alex também. A dica original foi fornecida por ele como um comentário para a pergunta, mas nunca foi postada como uma resposta.

    
por 20.02.2011 / 18:19
3

Aqui está um script para fazer isso:

aligntabs.pl

#!/usr/bin/perl

my $delim = '\s*\t\s*';

my %length = ();
my @lines = ();
for my $line (<>) {
    chomp $line;
    my @words = split $delim, $line;
    my $numwords = scalar(@words);
    for my $i (0..$numwords-1) {
        my $maxlen = $length{$i} // 0;
        my $thislen = length($words[$i]);
        $maxlen = ($thislen > $maxlen)? $thislen: $maxlen;
        $length{$i} = $maxlen;
    }
    push @lines, [@words];
}

foreach my $wordsref (@lines) {
    my @words = @$wordsref;
    my $numwords = scalar(@words);
    for my $i (0..$numwords-1) {
        if ($i < $numwords-1) {
            my $fieldlen = $length{$i};
            printf "%-${fieldlen}s ", $words[$i];
        }
        else {
            print $words[$i];
        }
    }
    print "\n";
}

uso

$ aligntabs.pl < infile
var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
    
por 20.02.2011 / 10:57
3

Para paradas de tabulação manuais: expand -t 42,48

Para paradas de tabulação automáticas, conforme sugerido por alex : column -t

( expand está em todos os sistemas POSIX. column é um utilitário BSD, disponível em muitas distribuições Linux também.)

    
por 20.02.2011 / 20:18
1

Seguindo o comentário de Peter.O que é o que eu queria alinhar (dados delimitados por tabulação, TSV), esta frase funciona muito bem:

column -t -s $'\t' /Users/me/data.csv | less --chop-long-lines
    
por 21.07.2016 / 21:51
0
sed 's/||/| |/g;s/||/| |/g' filename-here | column -s"|" -t | less -#2 -N -S

Explicação:

Sed adicionará um espaço entre os delimitadores em branco

Coluna adicionará espaçamento igual entre as colunas

zydsld|asl|asd
das|aosdk|dd

torna-se

zydsld|asl  |asd
das   |aosdk|dd 

Menos irá abrir a saída em um visualizador de arquivos. -N e -S adicionará o número da linha e desativará o agrupamento, respectivamente

    
por 06.08.2014 / 19:34