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

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

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

答え2

バイパス方式ですが、機能し、空の行と空のセルを考慮してテーブルを作成しますcolumn。複数のファイルを並べて組み合わせることができます。例えば。プレフィックス行

「F1」「ニオブ」
空白行は空白のセルとして表示されます(複数のファイルを貼り付ける場合)。
ファイルの長さは異なる場合があります。

# Make test data file    
echo -e "alpha\t1\t0.21085026\tok
beta\t4096\t0.0\tnext F1 line is blank

gamma\t\t-1.0\tinvalid" >F1
sed -n '=' F1 >Nb
echo -e "\tB\tC\textra F1 line" >>F1

# Set the positional parameters $1, $2
set Nb F1  

{ echo -e "<html>\n<table border=1 cellpadding=0 cellspacing=0>"
  paste "$@" |sed -e 's#\(.*\)#\x09\1\x09#
                      s#\x09# </pre></td>\n<td><pre> #g
                      s#^ </pre></td>#<tr>#
                      s#\n<td><pre> $#\n</tr>#'
  echo -e "</table>\n</html>"
}|w3m -dump -T 'text/html'

出力のテーブルバージョン:

┌───┬───────┬──────┬────────────┬───────────────────────┐
│ 1 │ alpha │ 1    │ 0.21085026 │ ok                    │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 2 │ beta  │ 4096 │ 0.0        │ next F1 line is blank │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 3 │       │      │            │                       │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 4 │ gamma │      │ -1.0       │ invalid               │
├───┼───────┼──────┼────────────┼───────────────────────┤
│   │       │ B    │ C          │ extra F1 line         │
└───┴───────┴──────┴────────────┴───────────────────────┘

フレームレスバージョンを取得するには、フレームを削除するだけです。これは、次のコード行に示すように、出力をさらにパイピングすることで簡単に実行できます。代替上記の表バージョンの最後の行に対応します。

# the replacement "new" last line
}|w3m -dump -T 'text/html' |sed -r '/^┌|├|└/d; s/^│ //g; s/ │$//g; s/ │ /│/g' 

「新しい」出力は次のとおりです。垂直区切り記号を所定の位置に保持した。必要でない場合は、最後のsed式を必要に応じて変更してください。

1│alpha│1   │0.21085026│ok                   
2│beta │4096│0.0       │next F1 line is blank
3│     │    │          │                     
4│gamma│    │-1.0      │invalid              
 │     │B   │C         │extra F1 line        

または次のように(2つのスペース) / │ /に変更してください。/ /

1  alpha  1     0.21085026  ok                   
2  beta   4096  0.0         next F1 line is blank
3                                                
4  gamma        -1.0        invalid              
          B     C           extra F1 line        

もちろん、前の数字はファイルを並べて「貼り付け」することを示すためのものです。

関連情報