gpt4 book ai didi

Linux:用列格式化流(管道)输出? (未确定的文件大小)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:01 24 4
gpt4 key购买 nike

我想使用 column 将我获取的文本内容格式化为标准输出流,但我失败了。例如,使用单行,一切正常:

$ echo "1 12 123 1234 1 12 123 1234 " | column -t
1 12 123 1234 1 12 123 1234

.. 但是,如果我尝试模拟“无尽”流:

$ while true; do echo "1 12 123 1234 1 12 123 1234 "; sleep 1; done | column -t
^C

... 根本没有响应,直到使用 Ctrl-C 退出。

(请注意,while 只是为了模拟从设备读取无限流,如“cat/dev/ttyUSB0”)

这让我相信,即使默认情况下 column 应该接受标准输入,它也需要一个“完整”和完成的文件(即具有确定的文件大小)才能工作;而在“无尽”流的情况下,情况并非如此 - 所以它永远不会输出任何东西。

关于如何在这种情况下实现列格式的任何建议?编辑:不一定是 column 程序;任何其他将文本格式化为列的东西都可以(但恐怕,例如 awk 也需要一个完整的文件)......

提前致谢,
干杯!

最佳答案

我也发现专栏无法流式传输令人失望,而 sdaau 的代码无法衡量我的专栏。所以这里有一个解决这两个问题的方法。也许效率不是很高,但无论如何它只是为了调试。我把它作为 pcol 在我的 ~/bin 文件夹中(一定要 chmod +x 它):

#!/usr/bin/env python
import sys

sep = ','
gutter = 2
for arg in sys.argv:
if arg.startswith('-s'):
sep = arg[2:]
elif arg.startswith('-g'):
gutter = int(arg[2:])

widths = []
while True:
raw = sys.stdin.readline()
line = raw.strip('\0').strip('\n')
vals = line.split(sep)
if len(vals) > len(widths):
widths = [0] * len(vals)

widths = [max(len(val) + gutter, width) for val, width in zip(vals, widths)]
metaformat = '%%%ds' * len(widths)
format = metaformat % tuple(widths)
print format % tuple(vals)

关于Linux:用列格式化流(管道)输出? (未确定的文件大小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6316816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com