Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/03/2016, à 16:54

lynn

[RÉSOLU] [bash] Random avec condition.

Bonjour,

J'ai un fichier nommé "liste" qui contient quinze mots.
J'utilise cette commande

shuf -n1 ~/liste

qui me renvoie aléatoirement un mot.

Y a t-il une solution pour empêcher qu'un même mot ne soit choisi deux fois de suite?

Merci pour vos conseils.

Dernière modification par lynn (Le 12/03/2016, à 19:07)


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#2 Le 12/03/2016, à 17:30

pingouinux

Re : [RÉSOLU] [bash] Random avec condition.

Bonjour,
Ça dépend de la façon dont tu veux utiliser les mots ensuite.
Pour récupérer dans une boucle tous les mots de la liste :

while read mot
do
   echo "=$mot="
done < <(shuf ~/liste)

Pour avoir un mot différent à chaque appel :

# Faire une copie de liste, qui va être modifié ensuite
mot=$(shuf -n1 ~/liste); echo "=$mot="; sed -i "/^$mot$/d" ~/liste

Hors ligne

#3 Le 12/03/2016, à 17:41

lynn

Re : [RÉSOLU] [bash] Random avec condition.

Bonjour pingouinux,

La deuxième solution est celle que je recherche; Le mot appelé doit être différent à chaque appel.


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#4 Le 12/03/2016, à 18:06

lynn

Re : [RÉSOLU] [bash] Random avec condition.

J'avais pensé à un truc qui note le résultat en /tmp et et qui l'exclu lors d'un autre appel de la commande mais je ne sais pas faire ça...


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#5 Le 12/03/2016, à 18:15

pingouinux

Re : [RÉSOLU] [bash] Random avec condition.

En adaptant la seconde méthode du #2 :

cp ~/liste /tmp/liste_provi

Puis, pour chaque appel :

mot=$(shuf -n1 /tmp/liste_provi); echo "=$mot="; sed -i "/^$mot$/d" /tmp/liste_provi

Hors ligne

#6 Le 12/03/2016, à 18:42

erresse

Re : [RÉSOLU] [bash] Random avec condition.

Bonjour,
Oui, travailler sur une copie, parce-que le sed -i met à jour le fichier source qui se retrouve vide à la fin du cycle...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#7 Le 12/03/2016, à 18:44

lynn

Re : [RÉSOLU] [bash] Random avec condition.

Ça fonctionne mais ce n'est pas tout à fait le fonctionnement que j'attends. Dans l'exemple que tu me propose, tous les noms seront inévitablement appelés. Il n'y a que le moment où ils vont être appelés qui est aléatoire.
Ce que je recherche, c'est le côté aléatoire du nom qui va sortir et pas si il va sortir à un moment donné; Supposons que je fasse une centaine d'appels, un ou plusieurs mots pourraient ne jamais être appelés et il pourrait y avoir vingt fois le même mot mais seulement, pas deux fois de suite.

J'espère avoir formulé correctement... tongue En tout cas merci pingouinux.


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#8 Le 12/03/2016, à 18:59

pingouinux

Re : [RÉSOLU] [bash] Random avec condition.

À appeler 1 fois, pour initialiser la variable :

mot_avant=""

Puis à chaque appel :

while true; do mot=$(shuf -n1 ~/liste); [[ $mot != $mot_avant ]] && { mot_avant=$mot; break; }; done; echo "=$mot="

Hors ligne

#9 Le 12/03/2016, à 19:07

lynn

Re : [RÉSOLU] [bash] Random avec condition.

Ça fonctionne.

Merci beaucoup pingouinux. Toujours au top. smile


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#10 Le 12/03/2016, à 19:42

Watael

Re : [RÉSOLU] [bash] Random avec condition.

salut,

bon, ben, vu qu'on a dégainé le bash :
s'il n'y a qu'un mot par ligne :

ar=( $(</chemin/fichier) )

à titre d'exemple :

$ ar=( $(shuf -n 12 /usr/share/dict/french) ) # pour rester dans l'esprit, mais le shuf ne sert à rien, ça aurait pu être head or tail ;)
$ printf '%s\n' "${ar[@]}"
chaudement
quorums
tamponnais
marmoriser
imprégnaient
insufflerai
généralisera
redoublerai
resquilleuses
acclimaterions
réhabilitèrent
outragerai
$ toRem=$((RANDOM%${#ar[*]}))
$ echo ${ar[toRem]}
outragerai
$ unset ar[$toRem]
$ ar=( ${ar[@]} )
$
$ toRem=$((RANDOM%${#ar[*]}))
$ echo ${ar[toRem]}
réhabilitèrent
$ unset ar[$toRem]
$ ar=( ${ar[@]} )
$ echo ${#ar[*]}
10

on peut mettre ça dans une boucle tant qu'il y a au moins un élément dans le tableau.

Dernière modification par Watael (Le 12/03/2016, à 19:45)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne