comando a la lista separada de la pestaña de diseño muy bien


39

A veces, obtengo como una lista separada por pestañas de entrada, que no está completamente alineada, por ejemplo

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

¿Hay una manera fácil de alinearlos?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

Alguien podría hacer una solución basada en topes elásticos: nickgravgaard.com/elastictabstops
Mikel


Y una implementación de Go: golang.org/pkg/tabwriter
Mikel

16
¿Trató de canalizarlo column -t?
alex

77
Escondido al final de la respuesta perl de Mikel está el comentario decisivo (por Mikel) ... columns -tactúa en espacios en blanco en general. Para trabajar con pestañas única , el usocolumn -t -s $'\t'
Peter.O

Respuestas:


51

Entonces, la respuesta se convierte en:

column -t file_name

Tenga en cuenta que esto divide las columnas en cualquier espacio en blanco, no solo las pestañas. Si desea dividir solo en pestañas, use:

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

Los -s $'\t'conjuntos de la delimitador para pestañas solamente y -nconservas vacías columnas (pestañas adyacentes).

PD: Solo quiero señalar que el crédito va para Alex también. La sugerencia original fue proporcionada por él como un comentario a la pregunta, pero nunca fue publicada como respuesta.


Esperaré un poco para que Alex obtenga el crédito, creo que se lo merece. Si no respondiera en unos días, aceptaré una respuesta de otra persona.
Elazar Leibovich

¡Seguro! Yo tampoco era consciente de column:)
Barun

1
Esto parece ideal, pero desafortunadamente columnparece fallar cuando encuentra celdas vacías. Ver este post . Según la versión columnque tenga, puede especificar la -nopción para corregir esto.
John J. Camilleri

Además, este comando no solo se dividirá en pestañas, sino también en "cualquier espacio en blanco". Para dividir solo en pestañas, use column -t -s $'\t'.
Fritz

3

Aquí hay un script para hacerlo:

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

Um, gracias, pero esperaba que hubiera una forma más "portátil" de hacerlo.
Elazar Leibovich

¡Yo también! No pude encontrar uno. pry nlson las dos herramientas básicas para el formato, y después de eso awk, sed, perl, etc.
Mikel

1
es tan simple comocolumn
Elazar Leibovich

2
@Elzar Excelente! column -t -s $'\t'Parece hacer el trabajo.
Mikel

3

Para tabulaciones manuales: expand -t 42,48

Para tabulaciones automáticas, como lo sugiere alex :column -t

(se expandencuentra en todos los sistemas POSIX. columnes una utilidad BSD, disponible también en muchas distribuciones de Linux).


1

Siguiendo el comentario de Peter.O, que es lo que quería alinear (datos delimitados por tabulaciones, TSV), esta frase funciona muy bien:

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

Explicación:

Sed agregará un espacio entre delimitadores en blanco

La columna agregará un espacio igual entre las columnas

zydsld|asl|asd
das|aosdk|dd

se convierte

zydsld|asl  |asd
das   |aosdk|dd 

Less abrirá la salida en un visor de archivos. -N y -S agregarán el número de línea y deshabilitarán el ajuste respectivamente


1
Las respuestas de una línea a menudo no son las más útiles. Considere expandir su publicación para incluir una explicación de su solución o documentación que la respalde.
HalosGhost

0

Con Miller ( http://johnkerl.org/miller/doc ) tiene una salida de impresión bonita.

correr

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

tener

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.