저는 게으른 편이라 스크립트를 작성할 수도 있지만 어떻게 해야 할지 생각하기에는 너무 게으릅니다.
나는 종종 다음과 같은 일을 합니다.
cris$ python runexperiment.py > output.txt
cris$ cat output.txt
때로는 실험의 긴 결과를 볼 때 페이지를 스크롤하면서 연속적인 패턴이 형성되고 분산되는 것을 보고 싶습니다. 그러나 100만 줄의 파일에 cat을 사용하면 5초 안에 완료됩니다. 이건 나한테도 너무 빠르다.
'스크롤 유틸리티'와 같이 파일 보기 속도를 늦출 수 있는 방법이 있습니까? 나는 빠른 속도를 원하지만 초당 200,000줄은 원하지 않습니다. (아마도 이 모든 라인은 어쨌든 디스플레이에 등록되지 않을 것입니다.)
같은 것
cris$ scroll -lps=300 output.txt
그런 다음 편안히 앉아서 초당 300줄이 지나가는 것을 보는 것이 이상적일 것이라고 상상합니다.
답변1
짧고읽을 수 있는:
perl -pe "system 'sleep .003'" log.txt
이 솔루션은 작고 읽기 쉽기 때문에 다음의 의견으로 게시합니다.DMAS의 답변이런 종류의 솔루션을 홍보하는 것 같습니다!
하지만 나는 이것을 싫어합니다: 이 실행을 위해 Perl은포크/bin/sleep
300x/초 까지 !
이것은 큰 자원 소비자입니다! 또한 잘못된좋은 솔루션!!
사용내장자다펄
불행하게도 내장 기능 sleep
은 정수로 제한됩니다. 따라서 대신 다음을 사용해야 합니다 select
.
perl -e 'print && select undef,undef,undef,.00333 while <>;'
Perl에서는 스위치 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라인/초는 0.0033333333초당 1라인을 의미합니다.
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).참고: 파일 이름이 숫자로만 구성된 경우 경로를 지정해야 할 수도 있습니다:
./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))
답변2
그냥 수면과 함께 awk를 사용하세요:
awk '{print $0; system("sleep .1");}' log.txt
답변3
통역사를 사용하는 대신 특별히 제작된 도구를 사용할 수 있습니다. 배포판에 설치되어 있거나 설치할 수 있습니다(apt-get install pv 등).
파일을 초당 5줄로 표시하려면:
cat filename | pv --quiet --line-mode --rate-limit 5
파일을 초당 100바이트로 표시하려면:
cat filename| pv --quiet --rate-limit 100
답변4
Ruby의 sleep
함수는 부동 소수점 값을 지원하므로 @F.Hauri의 답변을 기반으로 한 효율적이고 짧은 솔루션은 다음과 같습니다.
ruby -pe 'sleep 0.00333' log.txt
또는
ruby -pe 'sleep (1.0/300)' log.txt