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


39

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

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

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

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

有人可以基于弹性制止器
Mikel,



16
试过管道column -t吗?
Alex

7
在Mikel的perl答案结尾处隐藏着紧致的评论(作者Mikel)... columns -t作用于一般空白。要使用标签,请使用column -t -s $'\t'
Peter.O

Answers:


51

因此,答案变为:

column -t file_name

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

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

-s $'\t'套分隔符为制表符只和-n蜜饯空列(相邻突出部)。

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


我会等亚历克斯获得功劳,我认为他应得的。如果几天后他不回答,我会接受其他人的回答。
Elazar Leibovich

当然!我也没有意识到column:)
Barun

1
这似乎是理想的,但是不幸的column是,当它遇到空单元时似乎失败了。看到这篇文章。根据column您使用的版本,您可能可以指定-n更正此问题的选项。
John J. Camilleri 2012年

此外,此命令不仅会在选项卡上拆分,还会在“任何空白”上拆分。要仅在选项卡上拆分,请使用column -t -s $'\t'
Fritz

3

这是执行此操作的脚本:

aligntabs.pl

#!/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

嗯,谢谢,但是我希望有一种更“便携”的方式来做到这一点。
Elazar Leibovich

我也是!找不到一个。 pr并且nl是格式化的两个基本工具,在那之后awksedperl
米克尔-

1
就像column
Elazar Leibovich

2
@Elzar太好了! column -t -s $'\t'似乎可以胜任。
Mikel

3

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

对于自动制表位,如alex所建议:column -t

expand在所有POSIX系统上。column是BSD实用程序,在许多Linux发行版中也都可用。)



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

说明:

sed将在空白的delimter之间添加一个空格

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

zydsld|asl|asd
das|aosdk|dd

变成

zydsld|asl  |asd
das   |aosdk|dd 

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


1
单行答案通常不是最有用的。考虑扩展您的帖子,以包括对解决方案的说明或支持该解决方案的文档。
HalosGhost

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.