2009-02-11 3 views
7

Non riesco a ottenere --random-sort per lavorare con il comando sort su un sistema Fedora Linux.Il comando sort -R non ordina le righe casualmente in Linux

Alcune informazioni di contesto:

$ 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 

E il 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

opere come previsto in Ubuntu Ibex - così sembra come un problema specifico per la tua versione – Ken

+0

PCBSD (FreeBSD) non ha l'opzione casuale R o alternativa. Cygwin, Fedora Core 10 e le versioni di Ubuntu funzionano tutte. Forse più informazioni, come l'esatta versione del sistema operativo e la versione del pacchetto? – Godeke

+0

Hai la versione esatta del sistema operativo sopra o hai bisogno di qualcosa in più? Ora sono a casa e funziona su Ubuntu 8.04. Domani fornirò la versione del pacchetto se riesco a trovarlo (non sono così bravo con RPM e YUM). :-) –

risposta

14

Funziona sulla mia macchina Ubuntu 8.04. Forse il problema è la fonte dei randoms. Dal manuale:

--random-source = FILE

  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

Come predefinito dovrebbe essere/dev/urandom non dovrebbe avere importanza.L'ho provato e non importava. Comunque valeva la pena provare! –

2

Non so se bash funziona in questo modo, ma in ksh c'è il comando "dove", che ti dice esattamente cosa verrà eseguito se dovessi digitare l'argomento come comando, mentre "which" ti dirà solo la prima istanza del comando in $ PATH. Per esempio:

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

Dubito che sia il tuo problema, ma un passo di risoluzione dei problemi successivo sarebbe quello di specificare il percorso esatto (o sfuggire un possibile alias con un backslash) per "sort" quando lo si esegue:

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

Successivamente, potrei sospettare un ambiente o impostazioni locali che lo rendano insopportabile. Non necessariamente importante, ma le variabili LC_ * hanno spesso effetti collaterali inaspettati (la prima cosa che faccio su una nuova casella è impostata su LC_ALL = C per disattivare tutto =)).

+0

Ricorda inoltre che sort potrebbe essere una shell incorporata –

+0

da uomo che "cerca un eseguibile o uno script nelle directory elencate nella variabile di ambiente PATH utilizzando lo stesso algoritmo di bash". Non ho donde. Il percorso esatto dà lo stesso risultato. E LC_ALL = C non ha aiutato. Un sacco di buoni suggerimenti però! Ma niente da fare. :-( –

+0

La versione di bash di 'whence' è' type': '$ che echo ->/bin/echo' ma' $ tipo echo -> echo è una shell incorporata ' – sarnold

8

Dal manuale coreutils GNU:

Ordina per hashing delle chiavi di ingresso e poi l'ordinamento dei valori di hash. Scegli la funzione di hash a caso, assicurandoti che sia libero da collisioni in modo che i diversi tasti abbiano valori hash diversi. Questo è come una permutazione casuale degli input (vedi invocazione shuf), eccetto che le chiavi con lo stesso valore ordinano insieme.

Se vengono specificati più campi di ordinamento casuale, viene utilizzata la stessa funzione di hash casuale per tutti i campi. Per utilizzare diverse funzioni di hash casuali per campi diversi, è possibile richiamare l'ordinamento più di una volta.

GNU sort -R accetta lo stesso input e lo raggruppa; Questo thread può offrire alcune alternative: How can I randomize the lines in a file using standard tools on Red Hat Linux?

1

So che questo è un vecchio post, ma questa soluzione funziona molto bene ... nel caso in cui qualcuno è alla ricerca

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

Non vedo come questo codice sia rilevante alla domanda: –

+0

@ Ark-kun: sono d'accordo, la "soluzione" non è pertinente alla domanda. –