如何解决“tail -f”不发出 EOF 的问题并使其与“csvtool”等工具一起使用?

Spa*_*key 3 pipe tail csv

我基本上想这样做:

tail -f trades.csv | csvtool readable -

我想使用 csvtool 以可读格式读取 CSV 文件,并且想继续观看它。

我认为该命令不起作用,因为tail -f从不发出流结束信号,因此 csvtool 无限期地等待。当然,这个常见问题有解决方法吗?

谢谢

Gil*_*il' 5

不存在 \xe2\x80\x9c 发出 EOF\xe2\x80\x9d 这样的东西。EOF 不是带外信号。EOF 是指尝试读取时报告没有剩余数据可供读取。

\n

如果将输出通过管道传输tail -f到一个在开始发出输出之前读取整个输入的程序,则该程序在读取完整输入之前不会发出任何输出。由于tail -f永远不会关闭其输出(因为它永远不会停止发出输出),因此只有在终止尾部进程后才会发生这种情况。

\n

csvtool readable读取所有输入行,然后确定每个单元格的宽度,计算每列中单元格的最大宽度,最后发出宽度一致的所有行和列。在所有输入都可用之前不可能执行此计算,因为最后一行可能是具有最宽单元格的行。因此,在逻辑上不可能csvtool readable以在读取所有输入之前开始发出输出 \xc2\xb9 的方式进行设计。

\n

也许您不关心所有行具有相同的列宽。也许您只想要大部分宽度,如果出现更宽的行,宽度就会放大。这是合理的。但这不是 csvtool 提供的功能。

\n

在许多情况下,\xe2\x80\x9c在逐渐发出foo | bar输出时不会立即foo发出输出\xe2\x80\x9d 是由于foo. 请参阅关闭管道中的缓冲。但这不是这里发生的事情。对于不需要整个输入的 csvtool 子命令,输入来自缓冲其输出的程序,这可能是不同情况下的问题。

\n

如果您想要的只是将 CSV 中的逗号转换为某种列对齐方式,并且您愿意手动指定列宽,这里是两行:

\n
tail -f \xe2\x80\xa6 | python3 -u -c \'import csv, sys \nfor row in csv.reader(sys.stdin): print("\\t".join(row))\' | expand -t 11,13,17\n
Run Code Online (Sandbox Code Playgroud)\n

expand如果您对大多数终端和编辑器使用的默认每 8 列制表符感到满意,则不需要此步骤。

\n

\xc2\xb9对于挑剔者:超出第一行的第一个单元格,这没有帮助。

\n