|
[+] Pobieranie losowej linii z pliku
Akkon - 28-02-2009 17:04
Mam plik tekstowy a w nim kilkaset linijek. Poszukuję jakiegoś mechanizmu, który z tego pliku pobierałby losowo np. jedną linijkę. Na razie znalazłem coś pośredniego sed -n xp plik
dzięki temu sed wyświetla x linię pliku, ale brak tu elementu losowości, na którym mi zależy.
Z góry dziękuję za pomoc
ponton - 28-02-2009 17:36
Na szybko w Perlu: wczytuje plik (podany jako pierwszy argument) do pamięci, a potem losuje wiersz i go wypisuje:
#!/usr/bin/perl
if ($#ARGV > 0) { open(FILE, $ARGV[1]); @file = <FILE>; my $index = rand @file; my $line = @file[$index]; print $line; close FILE; } else { print "Missing argument!\n" }
Akkon - 28-02-2009 17:51
Na szybko w Perlu
Dzięki. Gdybyś był jeszcze tak miły i napisał, takiej całkowitej lamie z programowania jak ja :mrgreen: , w którym dokładnie miejscu mam podać lokalizację do mojego pliku?
beel - 28-02-2009 18:03
Albo z Pythonem, na jeszcze szybciej:
import linecache import random
filePath = "/home/beel/zadanie/przypadkowy"
liczba_linii = len(open(filePath, 'rU').readlines()) print linecache.getline(filePath, random.randint(0,liczba_linii)) linecache.clearcache()
ÂŚcieżkę widać gdzie podać. Linie losuje na całej zawartości pliku.
Akkon - 28-02-2009 18:53
beel, Twój skrypcik pięknie działa - dzięki. Mam tylko jedno pytanie. Edytowałeś swojego posta może, bo wcześniej było tak: print linecache.getline(filePath, random.randint(1,100)) linecache.clearcache()
a jest tak: liczba_linii = len(open(filePath, 'rU').readlines()) print linecache.getline(filePath, random.randint(0,liczba_linii)) linecache.clearcache()
Rozumiem, że wcześniej było tak, że wybierał linie z przedziału od 1 do 100? random.randint(1,100)
?
beel - 28-02-2009 18:55
Tak, zgadza się, edytowałem aby .. wyliczał linie i z całego zbioru losował. Wcześniej trzeba było ustawiać na sztywno..
ponton - 01-03-2009 09:08
Na szybko w Perlu
Dzięki. Gdybyś był jeszcze tak miły i napisał, takiej całkowitej lamie z programowania jak ja :mrgreen: , w którym dokładnie miejscu mam podać lokalizację do mojego pliku?
W żadnym, zapisujesz to do pliku np. randomline.pl, nadajesz mu prawa do uruchomienia (chmod +x randomline.pl) i wywołujesz:
./randomline.pl plik.txt
Albo z Pythonem, na jeszcze szybciej:
import linecache import random
filePath = "/home/beel/zadanie/przypadkowy"
liczba_linii = len(open(filePath, 'rU').readlines()) print linecache.getline(filePath, random.randint(0,liczba_linii)) linecache.clearcache()
ÂŚcieżkę widać gdzie podać. Linie losuje na całej zawartości pliku.
To jest trochę nieoptymalne najpierw wczytać plik, żeby policzyć liczbę wierszy, a potem znowu wczytać plik, żeby wyświetlić wylosowany wiersz. ;) Ja bym zrobić to tak (nie testowane):
import random
filePath = "/home/beel/zadanie/przypadkowy"
zawartosc = open(filePath, 'rU').readlines() wiersz = random.randint(0, len(zawartosc)) print zawartosc[wiersz]
Do kompletu jeszcze wersja w AWK-u. Przetestuj i wybierz najszybszą. :P
#!/usr/bin/awk -f
BEGIN { srand() i = 0 }
{ lines[i] = $0 ++i }
END { print lines[int(rand()*i)] }
./randomline.awk < plik.txt
beel - 01-03-2009 10:01
To jest trochę nieoptymalne najpierw wczytać plik, żeby policzyć liczbę wierszy, a potem znowu wczytać plik, żeby wyświetlić wylosowany wiersz. ;) Ja bym zrobić to tak (nie testowane):
Zastrzegałem, że na szybko i uwagi na to nie zwracałem..
Dałbym: wiersz = random.randint(0, len(zawartosc)-1)
Akkon - 01-03-2009 14:53
Jeszcze raz Wam dziękuję za pomoc. Do meritum:
zapisujesz to do pliku np. randomline.pl, nadajesz mu prawa do uruchomienia (chmod +x randomline.pl) i wywołujesz
Niestety nie działa cały czas otrzymuję komunikat Missing argument!
Do kompletu jeszcze wersja w AWK-u. Przetestuj i wybierz najszybszą. :P
Tu jest ok.
Dałbym: Kod: wiersz = random.randint(0, len(zawartosc)-1)
Skrypt po modyfikacjach działa. Rożnicy w szybkości nie zauważyłem :-D
Po wstępnych testach sądzę, że AWK będzie najwygodniejszy, gdyż plik z danymi nie musi być określony "na sztywno" w skrypcie tak jak jest w propozycji beela, choć z punktu widzenia moich potrzeb to jest w zasadzie marginalna niedogodność.
ponton - 01-03-2009 16:13
Niestety nie działa cały czas otrzymuję komunikat Missing argument!
Nie piszę w Perlu i jakiś problem miałem z liczbą argumentów... Możesz wykasować tego if-a i else-a i zostawić tylko to, co jest w pierwszej klamrze.
Akkon - 01-03-2009 22:32
Możesz wykasować tego if-a i else-a i zostawić tylko to, co jest w pierwszej klamrze.
Problem jest w zasadzie rozwiązany dzięki dwóm pozostałym skryptom, dlatego piszę tylko dla porządku, że ten w Perlu nadal nie działa.
Pozdrawiam
Akkon - 19-06-2010 13:33
Do kompletu jeszcze wersja w AWK-u. Przetestuj i wybierz najszybszą. :P
#!/usr/bin/awk -f
BEGIN { srand() i = 0 }
{ lines[i] = $0 ++i }
END { print lines[int(rand()*i)] }
./randomline.awk < plik.txt
Odświeżę trochę temat. Jak w tym przypadku wymusić by skrypt wybierał losowo, ale tylko spośród tych wartości, które wcześniej się nie pojawiły?
zanotowane.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|