コンテンツに応じてタブを展開する方法は?

コンテンツに応じてタブを展開する方法は?

Unixパイプからタブ区切りのデータを取得しました。このデータを人が読める簡単なテーブルにフォーマットしたいと思います。

これらのタブを空白に拡張し、フィールドデータの幅に応じてタブストップを自動的に設定するにはどうすればよいですか?

たとえば、私の仮想スクリプトは次のように生成できます(実際のタブ文字を表すgenerate_tsvために使用します)。\t

alpha\t1\t0.21085026\tok
beta\t4096\t0.0\tok
gamma\t\t-1.0\tinvalid

を使用すると、| expand -t 12次のようになります。

alpha       1           0.21085026  ok
beta        4096        0.0         ok
gamma                   -1.0        invalid

しかし、私は次のように少しコンパクトにしたいと思います(したがって、列を区切る2つのスペースがあります)。

alpha  1     0.21085026  ok
beta   4096  0.0         ok
gamma        -1.0        invalid

@jw013が提案したように近いですが、| column -t -s $'\t'空のセルを縮小するので正確ではありません。

alpha  1     0.21085026  ok
beta   4096  0.0         ok
gamma  -1.0  invalid

ベストアンサー1

column(1)古いBSDツールがある場合は、それを使用してきれいなcolumn -tテーブルを印刷してみてください。

空のセルを表示するには、各空のセルにスペースを挿入する方法を試すことができます(2つの連続したタブで識別可能)。アイデアはcolumn(1)、空白文字には独自の列を指定する必要がありますが、幅は単一文字であるため、テーブルサイズに影響を与えたり、出力で人に表示してはいけません。

generate_tsv | 
   awk '/\t\t/ { for (i = 0; i < 2; i++) gsub(/\t\t/, "\t \t") } 1' | 
   column -t -s $'\t'

上記のように、パイプに挿入された追加のコンテンツは、awkすべての空のセルにスペースを挿入します。 2つの連続した空のセル()を処理するには、2回のパスが必要です\t\t\t

おすすめ記事