很好地布局选项卡分隔列表的命令

很好地布局选项卡分隔列表的命令

有时,我会得到一个输入选项卡分隔的列表,例如,该列表不太对齐

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

有没有一种简单的方法可以使它们对齐?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

答案1

那么,答案就变成了:

column -t file_name

请注意,这会将列拆分为任何空格,不仅仅是制表符。如果您只想在选项卡上拆分,请使用:

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

-s $'\t'分隔符设置为仅制表符并-n保留空列(相邻制表符)。

PS:只是想指出功劳归于亚历克斯以及。最初的提示是他作为对问题的评论提供的,但从未作为答案发布。

答案2

对于手动制表位:expand -t 42,48

对于自动制表位,按照建议亚历克斯column -t

expand在所有POSIX系统column是一个 BSD 实用程序,在许多 Linux 发行版中也可用,这要归功于实用程序Linux.)

答案3

这是一个执行此操作的脚本:

对齐标签

#!/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";
}

用法

$ aligntabs.pl < infile
var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3

答案4

sed 's/||/| |/g;s/||/| |/g' filename-here | column -s"|" -t | less -#2 -N -S

解释:

sed 将在空白分隔符之间添加空格

列将在列之间添加相等的间距

zydsld|asl|asd
das|aosdk|dd

变成

zydsld|asl  |asd
das   |aosdk|dd 

Less 将在文件查看器中打开输出。 -N 和 -S 将分别添加行号和禁用换行

相关内容