comando para a lista separada da guia layout bem


39

Às vezes, estou recebendo como uma lista separada por guias 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

Alguém poderia fazer uma solução baseada em tabstops elásticas: nickgravgaard.com/elastictabstops
Mikel


E uma implementação Go: golang.org/pkg/tabwriter
Mikel

16
Tentou canalizá-lo para column -t?
20411 alex

7
Escondido no final da resposta perl de Mikel, está o comentário decisivo (de Mikel) ... columns -tatua no espaço em branco geral. Para trabalhar apenas com guias , usecolumn -t -s $'\t'
Peter.O

Respostas:


51

Então, a resposta se torna:

column -t file_name

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

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

Os -s $'\t'conjuntos do delimitador para separadores únicos e -nconservas vazios colunas adjacentes (separadores).

PS: Só quero ressaltar que o crédito também vale para Alex . A dica original foi fornecida por ele como um comentário à pergunta, mas nunca foi postada como resposta.


Vou esperar um pouco para Alex receber o crédito, acho que ele merece. Se ele não responder em alguns dias, aceitarei uma resposta de outra pessoa.
Elazar Leibovich 20/02

Certo! Eu também não tinha conhecimento de column:)
Barun

11
Isso parece ideal, mas infelizmente columnparece falhar quando encontra células vazias. Veja este post . Dependendo da sua versão column, você poderá especificar a -nopção para corrigir isso.
John J. Camilleri

Além disso, esse comando não será dividido apenas nas guias, mas também em "qualquer espaço em branco". Para dividir apenas nas guias, use column -t -s $'\t'.
Fritz

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

Hum, obrigado, mas eu esperava que houvesse uma maneira mais "portátil" de fazer isso.
Elazar Leibovich

Eu também! Não foi possível encontrar um. pre nlsão as duas ferramentas básicas para a formatação e, depois disso awk, sed, perl, etc
Mikel

11
é tão simples quantocolumn
Elazar Leibovich

2
@Elzar Excelente! column -t -s $'\t'parece fazer o trabalho.
Mikel

3

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

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

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


1

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

column -t -s $'\t' /Users/me/data.csv | less --chop-long-lines

0
sed 's/||/| |/g;s/||/| |/g' filename-here | column -s"|" -t | less -#2 -N -S

Explicação:

Sed adicionará um espaço entre delimters em branco

A coluna adicionará espaçamento igual entre as colunas

zydsld|asl|asd
das|aosdk|dd

torna-se

zydsld|asl  |asd
das   |aosdk|dd 

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


11
As respostas de uma linha geralmente não são as mais úteis. Considere expandir sua postagem para incluir explicações sobre sua solução ou documentação que a suporte.
precisa saber é o seguinte

0

Com o Miller ( http://johnkerl.org/miller/doc ), você tem uma boa saída de impressão.

Corre

mlr --inidx --ifs "\t" --opprint cat input | tail -n +2

Ter

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.