リアルタイムデータを列形式で指定(パイプライン)

リアルタイムデータを列形式で指定(パイプライン)

columnパイプを介して着信データに対して同様のフィルタリングを実行する方法はありますか?

column -t同様のことを行いますが、入力が完了するのを待たずにパイプライン化されたライブデータで使用できる方法を探しています。固定幅の列を強制的に適用できることはわかっていますが、フォーマットが変更されるたびにawk設定が多すぎます。

column -xPS:不完全なデータを模倣することは不可能だと思います。また、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単位の列にフォーマットします。

trGNUを含む一部の実装は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.

おすすめ記事