3

寻找一个列格式化脚本,我觉得这可能是一个单行 awk。理想情况下,我只需要一个小的 shell 脚本。

数据是制表符分隔的,每行中的每个单元格的长度都是可变的,当然,其中可能有空格。

所以我们有这样的东西

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

最终应该是这样的:

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

理想情况下,能够调整每个之间的硬间隔量。如果它在逐列的基础上查看会更好,因此前导的短单元格不会都获得相同的正确填充。

不理想:

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

理想的:

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

3 回答 3

4

如果您使用的是 BSD 派生的操作系统(包括 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 回答