微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Linux:使用列格式化流管道输出? 不确定的文件大小

| 我想使用
column
格式化作为标准输出流获得的文本内容,但是失败了。例如,使用一行就可以正常工作:
$ echo \"1 12 123 1234 1 12 123 1234 \" | column -t
1  12  123  1234  1  12  123  1234
..但是,如果我尝试模拟\“ endless \”流:
$ while true; do echo \"1 12 123 1234 1 12 123 1234 \"; sleep 1; done | column -t
^C
...根本没有响应,直到有人用Ctrl-C退出。 (请注意,
while
只是为了模拟从设备读取无尽的流,如\'
cat /dev/ttyUSB0
\')。 这使我相信,即使认情况下“ 0”应接受标准输入,它也需要一个“完整”和完成的文件(即具有确定的文件大小)才能起作用;如果是“无尽”流,则不是这种情况-因此它从不输出任何内容。 关于在这种情况下如何实现列格式的任何建议?编辑:不一定必须是
column
程序;将文本格式化为列的其他任何方法都可以(但是恐怕,例如
awk
还需要一个完整的文件)... 提前致谢, 干杯!     

解决方法

        我也发现列令人失望,因为它无法流式传输,而sdaau的代码也无法测量我的列。因此,这是解决这两个问题的方法。也许效率不是很高,但是无论如何它仅用于调试。我将它放在我的〜/ bin文件夹中为ѭ8be(一定要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)
    ,        没有响应,因为您的第二个命令创建了一个无限循环,然后要求完成后将结果传递到-t列。由于循环永远不会终止,因此-t列不会执行任何操作。我不确定您要完成什么,但是第二个命令的变体确实以一秒钟的间隔产生输出(这是我假设您想要的),这是:
while true; do echo \"1 12 123 1234 1 12 123 1234 \" | column -t; sleep 1; done
编辑: 我现在知道您在做什么。对于您的情况,您可以使用sed用制表符替换空格,只要位数不超过制表符大小,这将自动将数字与先前的前一行对齐:
echo \"1 12 123 1234 1 12 123 1234 \" | sed \'s/ /\\t/g\'
    ,        好的,多亏了这里的回答,我设法编写了一个可以完成此操作的python脚本;显然,您必须知道(并在脚本中输入)a-priori列的格式;这是脚本,
columnizeline.py
#!/usr/bin/env python

import sys;

#below no work:
#print sys.stdin;
#for line in sys.stdin:
#   sline=line.split(\' \')
#   print sline

while 1:
  next = sys.stdin.readline()
  ns = next.strip(\'\\0\').split(\' \') # remove null char
  ns.pop() # remove the last entry in the list,it is \'\\n\'
  #~ nextf = \"%4s %4s %4s %4s %4s %4s %4s %4s\" % (ns[0],ns[1],ns[2],ns[3],ns[4],ns[5],ns[6],ns[7])
  nextf=\"\"
  nsc = ns[0:6] # first 6 elements only
  for nsi in nsc:
    nextf = \"%s%5s\" % (nextf,nsi)
  print nextf
...这是一个小测试:
$ while true; do echo \"1 12 123 1234 1 12 123 1234 \"; sleep 1; echo \"100 1 123 12 1 12 123 1234 \"; sleep 1; done | ./columnizeline.py 
   1   12  123 1234    1   12  123 1234
 100    1  123   12    1   12  123 1234
   1   12  123 1234    1   12  123 1234
 100    1  123   12    1   12  123 1234
   1   12  123 1234    1   12  123 1234
 100    1  123   12    1   12  123 1234
^CTraceback (most recent call last): [...]
干杯!     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。