실시간 데이터를 열 형식으로 지정(파이프라인)

실시간 데이터를 열 형식으로 지정(파이프라인)

column파이프를 통해 들어오는 데이터에 대해 유사한 필터링을 수행하는 방법이 있습니까 ?

column -t비슷한 작업을 수행 하지만 입력이 완료될 때까지 기다리지 않고 파이프되는 라이브 데이터와 함께 사용할 수 있는 방법을 찾고 있습니다 . 고정 너비 열을 강제로 적용할 수 있다는 것을 알고 있지만 awk형식이 변경될 때마다 너무 많은 설정이 필요합니다.

column -x추신: 불완전한 데이터를 모방하는 것은 불가능하다고 생각합니다 . 또한 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멀티바이트 문자를 지원하지 않으며, expandGNU를 포함한 일부 구현은 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.

관련 정보