タブ区切りリストを素敵に配置するコマンド

タブ区切りリストを素敵に配置するコマンド

場合によっては、[入力]タブで区切られたリストがソートされていないことがあります。たとえば、次のようになります。

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おかげで、多くのLinuxディストリビューションでも利用できるBSDユーティリティです。ユーティリティ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 はそれぞれ行番号を追加し、改行を無効にします。

関連情報