2011-06-11 2 views
0

column을 사용하여 stdout 스트림으로 얻는 텍스트 콘텐츠의 서식을 지정하고 싶지만 실패합니다. 예를 들어, 하나의 회선을 사용하여 모든 잘 작동합니다 : I는 "무한"스트림 시뮬레이션하려고하면Linux : 열로 스트림 (파이프) 출력을 포맷 하시겠습니까? (미정의 파일 크기)

$ 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로 끝날 때까지.

기본적으로 column 표준 입력을 수용한다하더라도,

이 그렇게 믿고 날 리드합니다 (while 것은 단지 'cat /dev/ttyUSB0'에서와 같이 장치에서 끝없는 스트림을 읽는 시뮬레이션 의미합니다) 작업을 위해 "완전한"완성 된 파일 (즉, 결정된 파일 크기)이 필요합니다. "끝이없는"스트림의 경우에는 그렇지 않습니다. 따라서 아무 것도 출력하지 않습니다.

이 컨텍스트에서 열 서식을 얻는 방법에 대한 제안 사항은 무엇입니까? 편집 : 반드시 column 프로그램이 될 필요는 없습니다; 컬럼에 텍스트가 잘 될 것 포맷 아무것도 ... 사전에

감사합니다,
건배 (예를 awk를 들어,하지만 난 두려워도 전체 파일이 필요합니다)!

+3

대부분의 경우 열은 각 열을 만드는 방법을 폭 결정하기 위해 모든 입력을 읽을 수있다. 따라서 "끝이없는"스트림으로 사용할 수 없으면 결국 모든 메모리를 소비하게됩니다. – Keith

+0

@Keith를 확인해 주셔서 고마워요. - 그런 경우라고 추측합니다. 'column'은 여기에 적용되지 않습니다. 그러나 "파일 당"대신 "줄 단위"로 작동하는 대체 도구가 있습니까? 내 생각에,이 경우 컬럼 수와 컬럼 너비를 선험적으로 지정해야하지만, 내 사용에는 괜찮습니다. 건배! – sdaau

+2

대신 sed로 파이프를 옮기고 공백을 탭으로 바꾸고 터미널 탭 스톱으로 공백을 컬럼으로 포맷 할 수 있습니다. '... | sed -e 's/[] \ +/\ t/g'' – Keith

답변

1

나도 스트림을 사용할 수 없다는 점에서 실망스럽고, sdaau의 코드는 내 열을 측정 할 수 없다는 것을 발견했습니다. 그래서 여기에 두 문제에 대한 해결책이 있습니다. 아마도 대단히 효율적은 아니지만 어쨌든 디버깅 용입니다. 나는 (+ X를 chmod를해야합니다) pcol로 내 ~/bin 폴더에 있습니다

#!/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) 
+0

@chbrown에 대한 감사의 말을 전합니다. "true", "k = $ RANDOM % 800"; echo "1 12 $ 1234 1 12 123 $ RANDOM"; .py -s "-g3'"그리고 멋지게 작동합니다 :) ^^; 다시 한 번 감사드립니다 - 건배! – sdaau

1

두 번째 명령이 무한 루프를 생성 한 다음 응답이 완료되면 그 결과가 -t 열로 파이프되기 때문에 응답이 없습니다. 루프가 끝나지 않으므로 -t 열은 아무 것도하지 않습니다. 나는 당신이 달성하려고하는지 모르겠지만, (당신이 원하는 것을 내가 있으리라 믿고있어입니다) 일초 간격으로 출력을 생성하지 두번째 명령의 변형은 이것이다 :

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

편집 : 지금하고있는 일을 볼 수 있습니다.

echo "1 12 123 1234 1 12 123 1234 " | sed 's/ /\t/g' 
+0

안녕하세요 @ user507078 - 그 덕분에,하지만'cat/dev/ttyUSB0' - 데이터가 초마다 나타나는 것처럼, 장치에서 스트림을 읽는 것처럼 끝없는 스트림을 시뮬레이션하기 위해'while' 구조체를 사용하고있었습니다. .. – sdaau

0

OK, 응답 덕분에 : 자릿수 탭 크기를 초과하지 않는 상황의 경우, 자동으로 한 이전의 이전 라인에 숫자를 정렬 할 탭 공백을 대체 할 나오지도 사용할 수 있습니다 여기, 나는 그 일을 할 파이썬 스크립트를 만들었다. 분명히, 당신은 알 필요가 있습니다 (그리고 스크립트에 입력하십시오) 사전의 열 형식을; 여기 스크립트, 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): [...] 

건배!

관련 문제