초당 특정 라인 속도로 터미널에 Cat 파일 cat을 사용하면 5 초 안에

나는 게으르고 이것을하기 위해 스크립트를 작성할 수는 있지만, 그것을하는 방법을 생각하기에는 너무 게으르다.

나는 종종 다음과 같은 일을한다.

cris$ python runexperiment.py > output.txt
cris$ cat output.txt

때로는 실험의 긴 결과를 볼 때 페이지가 스크롤되어 연속적인 패턴이 형성되고 분산되는 것을보고 싶습니다. 그러나 백만 줄의 파일에 cat을 사용하면 5 초 안에 완료됩니다. 이것은 나조차도 빠르다.

‘스크롤 유틸리티’와 같은 파일을 보는 속도를 늦출 수있는 방법이 있습니까? 나는 빨리 원하지만 초당 200k 줄을 원하지 않습니다 (모두 디스플레이가 어쨌든 등록되지 않을 것입니다).

같은 것

cris$ scroll -lps=300 output.txt

그리고 앉아서 앉아서 초당 300 줄의 롤을 보는 것이 이상적이라고 생각합니다.



답변

짧고 읽기 쉬운 :

perl -pe "system 'sleep .003'" log.txt

DMas의 답변에 대한 의견 이 이러한 종류의 솔루션을 홍보하는 것처럼 보이기 때문에 작고 읽을 수 있기 때문에이 솔루션을 게시합니다 !

이 실행을 위해, 펄이됩니다하지만이 때문에 싫어 포크/bin/sleep300X / 초!

이것은 큰 자원 소비자입니다! 또한 잘못된 좋은 해결책 !

에서 내장 수면 사용

불행히도 내장 sleep은 정수로 제한됩니다. 따라서 select대신 사용해야 합니다.

perl -e 'print && select undef,undef,undef,.00333 while <>;'

펄 아래 print while <>에서 -p스위치 로 대체 할 수 있습니다 .

perl -pe 'select undef,undef,undef,.00333'

해보자:

time /bin/ls -l /usr/bin | perl -pe 'select undef,undef,undef,.00333' | wc
   2667   24902  171131

real    0m9.173s
user    0m0.056s
sys     0m0.048s

bc -l < <(echo 2667/9.173)
290.74457647443584432573

설명:

  • 300 라인 / 초는 1 라인 x 0.0033333333 초를 의미합니다.

  • print인수를 인쇄하지 않고 $_있는 기본 입력 공간 .

  • 로 불리는 ... | perl -e, ... | perl -ne또는 ... | perl -pe표준 입력보기 자동 할당 될 것 *STDIN기본 파일 디스크립터 따라서 <>동일 할 것 <STDIN>까지 표준 입력으로부터 판독되는 $/( 입력 레코드 분리 기본적으로 인 개행 도달 할 것). 영어에서는 기본적으로 표준 입력에서 줄을 <>읽고 내용을 변수에 할당 합니다.$_

  • && 조건이지만 체인 명령 구분 기호로 사용 되므로 다음 명령을 수행하여 한 줄을 인쇄 한 후 (성공적으로) 인쇄합니다.

  • select사용하지 않는 프로그래머의 트릭sleep 입니다. 이 명령은 파일 디스크립터 (입력 및 / 또는 출력, 파일, 소켓 및 / 또는 넷 소켓)에서 이벤트를 트랩하도록 설계되었습니다 . 이 명령을 사용하면 프로그램은 3 가지 종류의 이벤트, 피드 읽기 준비 , 피드 준비 완료일부 이벤트 피드에서 발생할 때까지 기다릴 수 있습니다. 네 번째 인수는 초 단위의 시간 초과이므로 구문은 입니다.select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>

더 정밀하게하려면 Time::Hiresperl 모듈을 사용할 수 있습니다 .

perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'

참고 : $.현재의 입력 라인 번호 .

더 나은로 작성 cat >catLps.pl

#!/usr/bin/perl -w

use strict;
use Time::HiRes qw|time|;

my $start=time;
my $lps=300;

$lps=shift @ARGV if @ARGV && $ARGV[0]=~/^(\d+)$/;
my $sleepPerLine=1/$lps;

print &&
    select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)
    while <>

용법:

catLps.pl [lps] [file] [file]...

첫 번째 인수 lps는 초당 선택적 행입니다. 숫자 인수 (기본값 : 300)

참고 : filename이 숫자 인 경우 path :로 지정해야합니다 ./3.

이와 cat같이 인수 및 / 또는 표준 입력으로 제공된 파일을 전달할 수 있습니다.

그래서 우리는 할 수있었습니다 :

TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040

time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042

재미를 위해 :

export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))

답변

수면과 함께 awk를 사용하십시오.

awk '{print $0; system("sleep .1");}' log.txt

답변

나는 파티에 늦었지만, 이것이 파이썬으로 시도하는 데 유용한 학습 연습이 될 것이라는 것을 알았으므로 내가 얻은 것을 넣을 것이다.

#!/usr/bin/env python3

import argparse
from time import sleep

parser = argparse.ArgumentParser(description='Echo a file slowly')
parser.add_argument('-i',
                    '--input-file',
                    type=argparse.FileType('r'),
                    default='-')
parser.add_argument('-d',
                    '--delay-in-ms',
                    type=int,
                    default='100')
args = parser.parse_args()

for line in args.input_file:
    print(line.rstrip())
    sleep(args.delay_in_ms/1000.0)

stdin 또는 인수 (-i)의 입력을 허용하며 기본적으로 1/10 초마다 한 줄을 쓰지만 다른 인수 (-d)로 변경할 수 있습니다.