2009-02-11 16 views
7

Nie mogę uzyskać --random-sort do pracy z poleceniem sort w systemie Fedora Linux.Polecenie sort -R nie sortuje linii losowo w systemie Linux.

Niektóre informacje kontekstowe:

$ cat /etc/fedora-release 
Fedora release 7 (Moonshine) 
$ which sort 
/bin/sort 
$ man sort | grep -A 2 '\-R' 
     -R, --random-sort 
       sort by random hash of keys 

$ man sort | grep -A 3 '\-R' 
     -R, --random-sort 
       sort by random hash of keys 

     --random-source=FILE 

a test:

$ echo -e "2\n1\n3\n5\n4" 
2 
1 
3 
5 
4 
$ echo -e "2\n1\n3\n5\n4" | sort -r # Sort in reverse order 
5 
4 
3 
2 
1 
$ echo -e "2\n1\n3\n5\n4" | sort -R # Sort in random order 
1 
2 
3 
4 
5 
$ # Fail! That's not random (I've tried it multiple times.) 
+0

działa zgodnie z oczekiwaniami w Ubuntu Ibex - tak wydaje jak problem specyficzny dla twojej wersji – Ken

+0

PCBSD (FreeBSD) nie ma opcji -R lub alternatywnie losowej. Cygwin, Fedora Core 10 i wersje Ubuntu działają. Być może więcej informacji, takich jak dokładna wersja systemu operacyjnego i wersja pakietu? – Godeke

+0

Masz dokładnie tę wersję systemu operacyjnego, czy potrzebujesz czegoś więcej? Jestem teraz w domu i działa na Ubuntu 8.04. Dostarczę wersję pakietu jutro, jeśli uda mi się ją znaleźć (nie jestem dobra z RPM i YUM). :-) –

Odpowiedz

14

To działa na moim Ubuntu 8.04 maszyny. Może problem jest źródłem random. Z instrukcji:

--random-source = plik

  get random bytes from FILE (default /dev/urandom) 
# this should give always the same result: 
echo -e '2\n1\n3\n5\n4' | sort -R --random-source=/dev/zero 

# this should be random: 
echo -e '2\n1\n3\n5\n4' | sort -R --random-source=/dev/urandom 
+0

Domyślnie ma to być/dev/urandom, nie powinno to mieć znaczenia.Testowałem to i nie miało to znaczenia. Warto było jednak spróbować! –

2

ja nie wiem, czy bash działa w ten sposób, ale w ksh jest komenda "skąd", który mówi dokładnie, co zostanie wykonane, jeśli chcesz wpisać argument jako polecenie, a "co" po prostu powie Ci pierwsze polecenie w zmiennej $ PATH. Na przykład:

wembley 0 /home/jj33 > which ls 
/bin/ls 
wembley 0 /home/jj33 > whence ls 
'/bin/ls -FC' 

wątpię, to twój problem, ale kolejny krok rozwiązywania problemów byłoby określić dokładną ścieżkę (lub uciec ewentualnego alias z backslash) dla „sort” podczas wykonywania go:

$ echo -e "2\n1\n3\n5\n4" | /bin/sort -R 

Po tym, mogę podejrzewać ustawienie środowiska lub ustawień lokalnych, które sprawiają, że jest on nieporęczny. Niekoniecznie ważne, ale zmienne LC_ * często mają nieoczekiwane efekty uboczne (pierwszą rzeczą, którą robię na nowym polu, jest ustawienie LC_ALL = C, aby wyłączyć to wszystko =)).

+0

Należy również pamiętać, że sortowanie może być powłoką wbudowaną –

+0

Od człowieka, który "wyszukuje plik wykonywalny lub skrypt w katalogach wymienionych w zmiennej środowiskowej PATH przy użyciu tego samego algorytmu co bash". Nie mam skąd. Dokładna ścieżka daje ten sam rezultat. A LC_ALL = C nie pomogło. Wiele fajnych sugestii! Ale nie ma kości. :-( –

+0

wersja 'whence' basha to' type': '$ która to echo ->/bin/echo' ale' $ typ echo -> echo to wbudowana powłoka' – sarnold

8

Od GNU Coreutils instrukcji:

Sortuj według mieszania kluczy wejściowych, a następnie sortowania wartości hash. Wybierz funkcję mieszania losowo, upewniając się, że jest wolna od kolizji, tak że różne klucze mają różne wartości mieszania. Jest to jak losowa permutacja danych wejściowych (patrz wywołanie shuf), , z wyjątkiem tego, że klucze o tej samej wartości sortują razem.

Jeśli określono wiele pól sortowania losowego, dla wszystkich pól używana jest ta sama funkcja losowego mieszania. Aby użyć różnych losowych funkcji skrótu dla różnych pól, możesz wywołać sortowanie więcej niż jeden raz.

GNU sort -R przyjmuje to samo wejście i łączy je razem; Ten wątek może oferować kilka alternatyw: How can I randomize the lines in a file using standard tools on Red Hat Linux?

1

Wiem, że to stary post, ale to rozwiązanie działa bardzo dobrze ... tylko w przypadku, gdy ktoś patrzy

dir='/home/path-to-folder' 
cd $dir 
file=`ls |sort -R |tail --lines=1` 
echo $file 
+0

Nie widzę, jak ten kod jest istotny na pytanie: –

+0

@ Ark-kun - Zgadzam się. "Rozwiązanie" nie ma związku z pytaniem. –

Powiązane problemy