나는 게으르고 이것을하기 위해 스크립트를 작성할 수는 있지만, 그것을하는 방법을 생각하기에는 너무 게으르다.
나는 종종 다음과 같은 일을한다.
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/sleep
300X / 초!
이것은 큰 자원 소비자입니다! 또한 잘못된 좋은 해결책 !
Perl 에서 내장 수면 사용
불행히도 내장 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::Hires
perl 모듈을 사용할 수 있습니다 .
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)로 변경할 수 있습니다.