Вкладка данных с отступом в заполненные столбцы - PullRequest
3 голосов
/ 02 декабря 2008

При поиске сценария форматирования столбца, я чувствую, что это может быть одна строка awk. В идеале мне нужен маленький сценарий оболочки.

Данные разделены табуляцией, каждая ячейка в каждой строке имеет переменную длину и, конечно, может содержать пробелы.

Итак, у нас есть что-то вроде этого

dasj    dhsahdwe    dhasdhajks  ewqhehwq    dsajkdhas
e dward das dsaw    das daswf
fjdk    ewf jken    dsajkw  dskdw
hklt    ewq vn1 daskcn  daskw

Должно получиться что-то вроде этого:

dasj       dhsahdwe   dhasdhajks ewqhehwq   dsajkdhas 
e dward    das        dsaw       das        daswf     
fjdk       ewf        jken       dsajkw     dskdw     
hklt       ewq        vn1        daskcn     daskw     

В идеале, возможность регулировать количество жестких интервалов между ними. Еще лучше, если он будет выглядеть по столбцам, поэтому ведущие короткие ячейки не все получают одинаковое правильное заполнение.

Не идеально:

1       dhsahdwe   dhasdhajks ewqhehwq   dsajkdhas 
2       das        dsaw       das        daswf     
3       ewf        jken       dsajkw     dskdw     
4       ewq        vn1        daskcn     daskw     

Ideal:

1  dhsahdwe  dhasdhajks  ewqhehwq  dsajkdhas 
2  das       dsaw        das       daswf     
3  ewf       jken        dsajkw    dskdw     
4  ewq       vn1         daskcn    daskw     

Ответы [ 3 ]

4 голосов
/ 27 мая 2009

Если вы работаете в операционной системе BSD (включая Mac OS X), столбец (1) и его опция -t могут делать то, что вы хотите:

% column -t coltest                                                               
dasj  dhsahdwe  dhasdhajks  ewqhehwq  dsajkdhas
e     dward     das         dsaw      das        daswf
fjdk  ewf       jken        dsajkw    dskdw
hklt  ewq       vn1         daskcn    daskw
1 голос
/ 02 декабря 2008

Вот, пожалуйста. Протестировано с "gawk".

BEGIN {
    FS = "\t";
    # max: Column width
    # fpl: Fields per line
    # data: Fields in every line
}
 { # Note the blank before this brace
    fpl[FNR] = NF;
    for (i=1; i<=NF; i++) {
        data[FNR, i] = $i;
        if (length($i) > max[i]) {
            max[i] = length($i);
        }
    }
}
END {
    for (l=1; l<=length(fpl); l++) {
        for (i=1; i<=fpl[l]; i++) {
            fmt = "%-" max[i] "s";
            if (i > 1) {
                printf " "; # This goes between columns
            }
            printf fmt, data[l, i];
        }
        printf "\n";
    }
}
1 голос
/ 02 декабря 2008

В неокрашенном Perl:

#!/usr/bin/perl -w

use strict;

my (@data, @length);
while (<>) {
    chomp;
    my @line = split(/\t/);
    foreach my $i (0 .. $#line) {
        my $n = length($line[$i]);
        $length[$i] = $n if (!defined($length[$i]) || $n > $length[$i]);
    }
    push(@data, [ @line ]);
}

$length[$#length] = 0; # no need to pad the last column
my $fmt = join("  ", map { "%-${_}s" } @length) . "\n";
foreach my $ref (@data) {
    printf $fmt, @$ref;
}
...