我想监视/跟踪 CSV 文件的更改(机器人的一些日志输出)。这是一个巨大的文件,带有<TAB>
分隔符和带有标题信息的第一行。
到目前为止,我正在使用 的输出tail - f <file.csv>
,但它没有按列格式化,看起来像:
yAccelRaw zAccelRaw xGyroRaw ... ... ...
3 256 1 ... ... ...
4 255 3 ... ... ...
4 255 -6 ... ... ...
3 253 -1 ... ... ...
4 254 2 ... ... ...
5 255 0 ... ... ...
4 255 3 ... ... ...
5 254 3 ... ... ...
5 253 -1 ... ... ...
4 255 3 ... ... ...
对于包含 30 列或更多列的 CSV,了解哪个值属于哪个列并不容易。我在徘徊是否有一个一般的打印表格格式的输出的解决方案?
到目前为止,我习惯tail -f <file.csv> | cut -f5,6
剪切特定的列并观察它们的输出,但我更喜欢完整的概述。另外,我尝试将结果传递给column
未更新的结果。
答案1
例如,您可以使用 awk 捕获第一行的标题,并每 10 行重复一次,并减少列大小以表示最多 5 个字符,如下所示:
tail -n +1 -f file.csv |
awk 'NR==1 { n=split($0,hdr) }
NR%10==1 { for(i=1;i<=n;i++)printf "%5.5s ",hdr[i];printf "\n" }
{ for(i=1;i<=n;i++)printf "%5.5s ",$i;printf "\n" }
'
这会给类似的东西
yAcce zAcce xGyro ...
3 256 1 ...
4 255 3 ...
4 255 -6 ...
3 253 -1 ...
4 254 2 ...
5 255 0 ...
4 255 3 ...
5 254 3 ...
5 253 -1 ...
4 255 3 ...
yAcce zAcce xGyro ...
3 256 1 ...
...
如果宽度仍然太宽而无法适合您的终端,您可以将结果通过管道传输到其中,less -S +F
使其行为类似于tail -f
,但如果您使用 Control-C 暂停尾部,则允许您使用箭头左右滚动。继续拖尾式F
。
答案2
Column 完全满足您的要求。您可以使用参数将 tab 标识为分隔符。为什么这里没有管道到 column 的选项?cat <file.csv> | column -s "\t"