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개 단위 열로 형식화합니다.
( tr
GNU를 포함한 일부 구현은 tr
멀티바이트 문자를 지원하지 않으며, expand
GNU를 포함한 일부 구현은 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.