タブ区切りリストをうまくレイアウトするコマンド


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

誰かが弾性タブストップに基づいてソリューションを作成できます:nickgravgaard.com/elastictabstops
Mikel



16
配管しようとしましたcolumn -tか?
アレックス

7
Mikelのperlの答えの最後に隠れているのは、クリンチャーコメント(Mikelによる)です... columns -t一般的な空白に作用します。で動作するようにタブのみ、使用column -t -s $'\t'
Peter.O

回答:


51

したがって、答えは次のようになります。

column -t file_name

これは、タブだけでなく空白文字で列を分割することに注意してください。タブのみで分割する場合は、次を使用します。

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

-s $'\t'設定タブにデリミタのみと-nジャム空の列(隣接するタブ)。

PS:クレジットはAlexにも当てはまることを指摘したいだけです。元のヒントは彼から質問へのコメントとして提供されましたが、回答として投稿されることはありませんでした。


アレックスがクレジットを得るまで少し待ちます、彼はそれに値すると思います。彼が数日以内に答えないなら、私は他の誰かからの答えを受け入れます。
エラザールレイボヴィッチ

もちろん!私も気づかなかったcolumn:)
Barun

1
これは理想的なcolumnように見えますが、残念ながら空のセルに遭遇すると失敗するようです。この投稿を参照してください。使用しているバージョンに応じて、これを修正columnする-nオプションを指定できる場合があります。
ジョンJ.カミレリ

また、このコマンドはタブだけでなく、「任意の空白」でも分割されます。タブだけで分割するには、を使用しますcolumn -t -s $'\t'
フリッツ

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

ええと、ありがとう。しかし、もっと「ポータブル」な方法があることを望んでいた。
エラザールライボビッチ

私も!見つかりませんでした。 prそして、nl書式設定、およびそれ以降のための2つの基本的なツールですawksedperl、など
ミケル

1
それは簡単ですcolumn
エラザールライボビッチ

2
@Elzarすばらしい! column -t -s $'\t'仕事をしているようです。
ミケル

3

手動タブストップの場合: expand -t 42,48

alexが提案する自動タブストップの場合:column -t

expandすべてのPOSIXシステムcolumnにあります。BSDユーティリティであり、多くのLinuxディストリビューションでも利用可能です。)


1

Peter.Oのコメント(タブ区切りデータ、TSV)に続いて、このフレーズは非常にうまく機能します。

column -t -s $'\t' /Users/me/data.csv | less --chop-long-lines

0
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はそれぞれ行番号を追加し、折り返しを無効にします


1
多くの場合、1行の回答はあまり役に立ちません。ソリューションの説明またはそれをサポートするドキュメントを含めるように投稿を拡大することを検討してください。
HalosGhost 14

0

Miller(http://johnkerl.org/miller/doc)を使用すると、きれいな印刷出力が得られます。

走る

mlr --inidx --ifs "\t" --opprint cat input | tail -n +2

持つ

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.