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.