Tabs 制表符填充列的间距数据

Tabs 制表符填充列的间距数据,tabs,alignment,spaces,Tabs,Alignment,Spaces,寻找一个列格式脚本,我有一种感觉,这可能是一个单行awk。理想情况下,我只需要一个小的shell脚本 数据以制表符分隔,每行中的每个单元格长度可变,当然,其中可能有空格 所以我们有类似的东西 dasj dhsahdwe dhasdhajks ewqhehwq dsajkdhas e dward das dsaw das daswf fjdk ewf jken dsajkw dskdw hklt ewq vn1 daskcn daskw dasj d

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

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

所以我们有类似的东西

dasj dhsahdwe dhasdhajks ewqhehwq dsajkdhas e dward das dsaw das daswf fjdk ewf jken dsajkw dskdw hklt ewq vn1 daskcn daskw dasj dhsahdwe dhashajks ewqhehwq dsajkdhas e侏儒达斯dsaw达斯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 dasj dhsahdwe dhashajks ewqhehwq dsajkdhas e侏儒达斯dsaw达斯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 1 dhsahdwe DHADHAJKS 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 1 dhsahdwe DHADHAJKS ewqhehwq dsajkdhas 2 das dsaw das daswf 3 ewf jken dsajkw dskdw 4 ewq vn1 daskcn daskw 在未禁用的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;
}
#/usr/bin/perl-w
严格使用;
my(@数据,@长度);
而(){
咀嚼;
我的@line=split(/\t/);
每个我的$i(0..$#行){
my$n=长度($line[$i]);
$length[$i]=n如果(!已定义($length[$i])| |$n>$length[$i]);
}
推送(@data,[@line]);
}
$length[$#length]=0;#无需填充最后一列
my$fmt=join(“,map{”%-${{s}@length)。“\n”;
foreach my$ref(@data){
printf$fmt,@$ref;
}
给你。用“呆呆”测试

开始{
FS=“\t”;
#最大:列宽
#fpl:每行字段数
#数据:每行中的字段
}
{注意这个支架前的空白。
fpl[FNR]=NF;
对于(i=1;i最大值[i]){
最大[i]=长度($i);
}
}
}
结束{

对于(l=1;l如果您使用的是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

可能还需要添加-s选项以限制列分隔符。默认情况下,空格和制表符可能会分隔列。在看到此答案之前,我几乎同意了呆滞的答案。感谢您提供了一个简单的解决方案!
% column -t coltest                                                               
dasj  dhsahdwe  dhasdhajks  ewqhehwq  dsajkdhas
e     dward     das         dsaw      das        daswf
fjdk  ewf       jken        dsajkw    dskdw
hklt  ewq       vn1         daskcn    daskw