有没有办法对column
通过管道传输的数据进行过滤?
我正在寻找一种方法来做类似的事情column -t
,但无需等待输入结束,因此它适用于通过管道传输的实时数据。我知道我可以通过 强制固定宽度的列awk
,但是每次格式更改时都需要进行太多设置。
PS:我认为模仿column -x
不完整的数据是不可能的。我也认为column -t
不可能在不完整的数据上完美复制。如果解决方案首先输出较窄的列,然后随着更多行的到达而扩展它们,则可以。
编辑:说明这不是缓冲问题的示例:
yes something | cat -n | tr -s '\t' ' ' | column -t
关键
column -t
在于它会根据每列中每个字段的最大值自动对齐列中的字段。如果您的输入包含
它将输出:
如果添加:
输入线,输出变为:
column
需要读取所有输入行以确定每列的宽度,并且在此之前无法开始输出任何内容。解决此问题的唯一方法是您知道或可以猜测每列的最大宽度。
例如,如果您知道字段永远不会超过 10 个单元格,您可以执行以下操作:
将输出格式化为 12 单元大列。
(注意
tr
包括 GNU 在内的一些实现tr
不支持多字节字符,而expand
包括 GNU 在内的一些实现expand
既不支持多字节字符也不支持零宽度或双宽度字符)对于宽度动态适应新输入宽度的列的解决方案,您可以执行以下操作:
例如,在 的输出上
lorem -p 2 | fmt -w 40
,给出:或者仅重新格式化前 3 列:
给予: