column
パイプを介して着信データに対して同様のフィルタリングを実行する方法はありますか?
column -t
同様のことを行いますが、入力が完了するのを待たずにパイプライン化されたライブデータで使用できる方法を探しています。固定幅の列を強制的に適用できることはわかっていますが、フォーマットが変更されるたびにawk
設定が多すぎます。
column -x
PS:不完全なデータを模倣することは不可能だと思います。また、column -t
不完全なデータを完全に複製することも不可能だと思います。解決策が最初により狭い列を出力し、次により多くの行が到着したら、それを拡張してもかまいません。
編集:これを示す例はバッファリングの問題ではありません。
yes something | cat -n | tr -s '\t' ' ' | column -t
答え1
要点は、column -t
各列の各フィールドの最大値に基づいて列のフィールドを自動的にソートすることです。
入力内容に以下が含まれている場合
a b
a b
a bc
次のように出力されます。
a b
a b
a bc
追加する場合:
xxxxx b
ワイヤが入力に接続されると、出力は次のようになります。
a b
a b
a bc
xxxxx b
column
読まなければならないみんな各列の幅を決定するために行を入力し、それまでは何も出力を開始できません。
この問題を解決する唯一の方法は、各列の最大幅を知ったり推測したりすることです。
たとえば、フィールドが10個のセルより大きくないことがわかっている場合は、次のようにします。
<input tr -s '[:blank:]' '[\t*]' | expand -t 12
出力を12単位の列にフォーマットします。
(tr
GNUを含む一部の実装はtr
マルチバイト文字をサポートしていません。GNUを含むexpand
一部のexpand
実装はマルチバイト文字、幅が0、幅が2文字の文字をすべてサポートしていません。)
列幅が新しい入力幅に動的に適用されるソリューションの場合は、次のことができます。
perl -Mopen=locale -MText::CharWidth=mbswidth -lae '
for (0..$#F) {$l = mbswidth$F[$_]; $l[$_] = $l if $l > $l[$_]}
print((map {sprintf "%-$l[$_]s ", $F[$_]} (0..$#F-1)), $F[$#F])'
たとえば、 の出力で次のように与えられますlorem -p 2 | fmt -w 40
。
Rerum aut pariatur nihil
modi. Exercitationem ut
animi. Quibusdam dolores
voluptates pariatur vel
tempora. Adipisci expedita voluptate
dolores qui consequatur. Laboriosam
eum ea. Quasi ab qui harum
repudiandae consequatur quasi
Nobis quia nesciunt laudantium.
enim exercitationem
earum. Pariatur nesciunt
maiores natus nemo delectus. Ut
ad voluptatem. Consequatur sint
enim sequi aut est nihil. Et at
または、最初の3列の形式を再指定してください。
perl -Mopen=locale -MText::CharWidth=mbswidth -lne '
@F = /(\S+)\s+(\S+)\s+(\S+)\s*(.*)/;
for (0..$#F) {$l = mbswidth$F[$_]; $l[$_] = $l if $l > $l[$_]}
print((map {sprintf "%-$l[$_]s ", $F[$_]} (0..$#F-1)), $F[$#F])'
与える:
Sit earum voluptatem cum adipisci aut
commodi. Quia aut eaque rerum nihil
aperiam. Dolor quia illo et. Quasi
illum est aliquam consequatur maiores
voluptatibus. Optio consectetur aliquid
Aspernatur omnis ex dolor nemo delectus
sit quia ut. Voluptatum voluptatibus
suscipit vel quos. Quo a at et non
cumque voluptate dolorum nostrum. Eos
ex est deleniti necessitatibus
assumenda provident culpa. Ut
sed et labore ullam voluptatum
impedit. Tempora delectus et rem dicta
debitis odit dignissimos.