Jestem leniwy i mógłbym napisać skrypt, aby to zrobić, ale jestem zbyt leniwy, aby wymyślić, jak to zrobić.
Często robię takie rzeczy jak:
cris$ python runexperiment.py > output.txt
cris$ cat output.txt
Czasami, patrząc na długi wynik eksperymentu, lubię pozwalać stronie przewijać się i patrzeć, jak kolejne wzorce tworzą się i rozpraszają. Ale użycie cat na pliku z 1 milionem linii kończy się może w 5 sekund. To jest zbyt szybkie nawet dla mnie.
Czy jest jakiś sposób na spowolnienie przeglądania pliku, coś w rodzaju „narzędzia do przewijania”? Chcę szybko, ale nie 200 000 wierszy na sekundę (z których wszystkie prawdopodobnie i tak nigdy się nie zarejestrują).
Coś jak
cris$ scroll -lps=300 output.txt
A potem wyobrażam sobie, że siedzenie i oglądanie 300 linii na sekundę jest idealne.
cat FILENAME | pv -l -L 900 -q
. Limit jest w bajtach na sekundę, a nie liniach na sekundę, więc robię z tego komentarz, a nie odpowiedź.Odpowiedzi:
Krótki i czytelny :
Publikuję te rozwiązania, ponieważ są one małe i czytelne, ponieważ komentarze do odpowiedzi DMas wydają się promować takie rozwiązanie!
Ale nienawidzę tego powodu: W tym okresie, Perl będzie bulić do
/bin/sleep
300x / sek!To duży konsument zasobów! Również złe dobre rozwiązania !!
Korzystanie z wbudowanego trybu uśpienia w Perlu
Niestety, wbudowane
sleep
jest ograniczone do liczb całkowitych.select
Zamiast tego musimy użyć :W Perlu
print while <>
można zastąpić-p
przełącznikiem:Spróbujmy:
Wyjaśnienie:
300 linii / sek oznacza 1 linię o 0,0033333333 sek.
print
bez argumentów,$_
które są domyślną przestrzenią wejściową .wywoływane jako
... | perl -e
,... | perl -ne
lub... | perl -pe
automatycznie zostanie przypisane standardowe wejście, do*STDIN
którego jest domyślny deskryptor pliku , więc<>
zrobi to samo,<STDIN>
co odczytane ze standardowego wejścia, dopóki nie zostanie osiągnięty$/
( separator rekordów wejściowych, który jest domyślnie nowy wiersz ). W języku angielskim domyślnie<>
odczytuje jeden wiersz ze standardowego wejścia i przypisuje zawartość do$_
zmiennej.&&
jest warunkiem i , ale jest tam stosowany jako separator poleceń łańcuchowych, więc po (pomyślnym) wydrukowaniu jednego wiersza i wykonaniu następnego polecenia.select
to sztuczka programisty, której nie należy używaćsleep
. To polecenie służy do przechwytywania zdarzeń na deskryptorach plików (wejścia i / lub wyjścia, pliki, gniazda i / lub gniazda sieciowe). Za pomocą tego polecenia program może czekać na 3 rodzaje zdarzeń, kanał gotowy do odczytu , kanał gotowy do zapisu i pewne zdarzenie wydarzyło się podczas kanału . Czwarty argument to limit czasu w sekundach, więc składnia jestselect <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
.Dla większej precyzji możesz użyć
Time::Hires
modułu perl:Uwaga:
$.
jest bieżącym numerem linii wejściowej .Lepiej napisane jako
cat >catLps.pl
Stosowanie:
Abyśmy mogli:
Dla zabawy:
źródło
Time::HiRes
modułu perl dla większej dokładności-p
komendy switch to perl skrypt został rozjaśniony!po prostu użyj awk ze snem:
źródło
system(*sleep .1")
wygeneruje 10 rozwidleń / s! Można to napisaćperl -pe 'system "sleep .1"' log.txt
: też czytelne, ale bardzo drogie (nie przyjazne dla systemu!)Spóźniłem się na przyjęcie, ale uznałem, że byłoby to przydatne ćwiczenie do nauki w Pythonie, więc przygotuję to, co mam:
Akceptuje dane wejściowe ze stdin lub jako argument (-i) i domyślnie zapisuje jedną linię na 1/10 sekundy, ale można to zmienić za pomocą innego argumentu (-d).
źródło