2010-02-27 4 views
9

je une commande qui jaillit d'un certain nombre de lignes de sortie standard:choisir une ligne au hasard dans stdout

$ listall 
foo 
bar 
baz 

Comment extraire une entrée aléatoire à partir de cela, dans une seule ligne (de préférence sans awk), de sorte Je peux juste l'utiliser dans un tuyau:

$ listall | pickrandom | sed ... | curl ... 

Merci!

Répondre

16
listall | shuf | head -n 1 
+0

Excellent, exactement ce dont j'avais besoin (je ne connaissais pas shuf) - merci! – AnC

+10

effectivement "listall | shuf -n 1" semble assez – xiechao

+1

Pas très portable: -bash: shuf: commande introuvable – Idelic

2

L'utilisation de Perl:

  • perl -MList::Util=shuffle -e'print((shuffle<>)[0])'

  • perl -e'print$listall[$key=int rand(@listall=<>)]'

+0

Merci. Bien que plus complexe que de simplement utiliser shuf, cela pourrait être utile un jour. – AnC

2

C'est-mémoire en toute sécurité, contrairement à l'utilisation shuf Liste :: Util lecture aléatoire:

listall | awk 'BEGIN { srand() } int(rand() * NR) == 0 { x = $0 } END { print x }'

Cela ne serait important que si listall pouvait renvoyer un résultat énorme.

Pour plus d'informations, voir l'entrée DADS au reservoir sampling.

+0

Bon à savoir, merci! Ce n'est pas une préoccupation pour ce cas particulier, mais je n'avais même pas pensé à ce problème avant ... – AnC

+1

J'ai ajouté un lien avec plus d'informations. :) –

2

vous pouvez le faire avec bash juste, sans d'autres outils autres que "listAll"

$ lists=($(listall)) # put to array 
$ num=${#lists[@]} # get number of items 
$ rand=$((RANDOM%$num)) # generate random number 
$ echo ${lists[$rand]} 
+0

Beaucoup de bonnes réponses ici - merci! – AnC

+0

Celui-ci doit lire toutes les lignes en mémoire – pihentagy

0

Enregistrez ce qui suit comme un script (randomline.sh):

#! /bin/sh 
set -- junk $(awk -v SEED=$$ 'BEGIN { srand(SEED) } { print rand(), $0 }' | sort -n | head -1) 
shift 2 
echo "[email protected]" 

et l'exécuter comme

$ listall | randomline.sh
3

Certains se sont plaints de ne pas avoir shuf disponibles sur leurs installations, alors peut-être e est plus accessible: listall | sort -R |head -n 1. -R est "trier au hasard".

+1

Je crains que '-R' ne soit pas disponible sur OS X. – AnC

Questions connexes