3

列の書式設定スクリプトを探していますが、これは 1 行の awk になる可能性があると感じています。理想的には、小さなシェル スクリプトだけで十分です。

データはタブで区切られ、各行の各セルは可変長で、もちろんスペースが含まれている場合があります。

だから私たちはこのようなものを持っています

dasj dhsahdwe dhasdhajks ewqhehwq dsajkdhas
エドワード・ダス・ダス・ダス・ダスフ
fjdk ewf jken dsajkw dskdw
hklt ewq vn1 daskcn daskw

最終的には次のようになります。

dasj dhsahdwe dhasdhajks ewqhehwq dsajkdhas
エドワード・ダス・ダス・ダス・ダスフ     
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     

理想:

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

3 に答える 3

4

BSD 由来の OS (Mac OS X を含む) を使用している場合、column(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
于 2009-05-27T18:14:23.433 に答える
1

難読化されていない 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;
}
于 2008-12-02T08:27:33.833 に答える
1

どうぞ。「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";
    }
}
于 2008-12-02T08:39:05.387 に答える