OVH Cloud OVH Cloud

desordonner un fichier en zsh

6 réponses
Avatar
Rakotomandimby
Bonjour,
J'ai un fichier qui contient NB lignes
Je souhaite faire un fichier qui contient les meme lignes mais dans un ordre
aleeatoire , sans qu'il en manque une ni qu'il y en aie une de plus ...
En fait c'est une playlist que je veux "randomizer"
Il y a environ 2.300 ligne a ce fichier .
comment m'en sortir en shell ? j'ai une attirance pour zsh mais je pense que
ça ne reposera pas uniquement sur zsh mais aussi sur awk , sed , wc ...

Je n'ai pas encore commencé mais l'agorithme que je me propose de suivre
est :

- compter le nobre de lignes du fichier avec wc -l -> NB_LN
boucle for ( jusqu'a ce que NB_LN == 0 ( ou 1 ?)
- piocher un nombre aleatoire (comment ?) entre 1 et NB_LN
et lire la ligne correspondant dans le fichier -> CURRENT_LN
- ecrire CURRENT_LN dans le nouveau fichier
- retirer CURRENT_LN de l'ancien fichier
- NB_LN = NB_LN - 1
fin boucle for.

Pour faire une boucle for simple en zsh , j'ai des erreurs avec les { } et
les ; qu'il faut mettre ... et ausi avec les [ ] ... mais ça avance
lentement ... si qqun avait une explication en Français sur l'utilisation
de ces signes je suis preneur :-)

Merci d'avance a S.C. et a vous tous .

--
http://mrakotom.free.fr

6 réponses

Avatar
Laurent Wacrenier
Rakotomandimby écrit:
J'ai un fichier qui contient NB lignes
Je souhaite faire un fichier qui contient les meme lignes mais dans un ordre
aleeatoire , sans qu'il en manque une ni qu'il y en aie une de plus ...
En fait c'est une playlist que je veux "randomizer"
Il y a environ 2.300 ligne a ce fichier .
comment m'en sortir en shell ? j'ai une attirance pour zsh mais je pense que
ça ne reposera pas uniquement sur zsh mais aussi sur awk , sed , wc ...


Sous zsh :

< fichier while read line; do echo "$RANDOM:$line"; done |
sort | sed 's/^[^:]*://'

Avatar
Pascal Bourguignon
Rakotomandimby writes:

Bonjour,
J'ai un fichier qui contient NB lignes
Je souhaite faire un fichier qui contient les meme lignes mais dans un ordre
aleeatoire , sans qu'il en manque une ni qu'il y en aie une de plus ...
En fait c'est une playlist que je veux "randomizer"
Il y a environ 2.300 ligne a ce fichier .
comment m'en sortir en shell ? j'ai une attirance pour zsh mais je pense que
ça ne reposera pas uniquement sur zsh mais aussi sur awk , sed , wc ...

Je n'ai pas encore commencé mais l'agorithme que je me propose de suivre
est :

- compter le nobre de lignes du fichier avec wc -l -> NB_LN
boucle for ( jusqu'a ce que NB_LN == 0 ( ou 1 ?)
- piocher un nombre aleatoire (comment ?) entre 1 et NB_LN
et lire la ligne correspondant dans le fichier -> CURRENT_LN
- ecrire CURRENT_LN dans le nouveau fichier
- retirer CURRENT_LN de l'ancien fichier
- NB_LN = NB_LN - 1
fin boucle for.

Pour faire une boucle for simple en zsh , j'ai des erreurs avec les { } et
les ; qu'il faut mettre ... et ausi avec les [ ] ... mais ça avance
lentement ... si qqun avait une explication en Français sur l'utilisation
de ces signes je suis preneur :-)

Merci d'avance a S.C. et a vous tous .


J'ai une commande random alors:

while read line ; do echo "`random` $line" ; done < fichier
| sort -n | sed -e 's/^[0-9][0-9]* //' > aleatoire

Sinon, en bash $RANDOM donne 15 bits; mieux vaut utiliser $RANDOM$RANDOM:

while read line ; do echo "$RANDOM$RANDOM $line" ; done < fichier
| sort -n | sed -e 's/^[0-9][0-9]* //' > aleatoire


--
__Pascal_Bourguignon__
http://www.informatimago.com/
Do not adjust your mind, there is a fault in reality.
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Laurent Wacrenier
Pascal Bourguignon écrit:
Sinon, en bash $RANDOM donne 15 bits; mieux vaut utiliser $RANDOM$RANDOM:


Quel interêt ?
Si ce sont des nombres pseudo-aléatoires, dont l'un dépend du précédent,
celà réduit la période et ne laisse que 14 bits de liberté.

Et dans le but de désordonner, 15 bits, c'est bien suffisant.

Avatar
Pascal Bourguignon
Laurent Wacrenier <lwa@ teaser . fr> writes:

Pascal Bourguignon écrit:
Sinon, en bash $RANDOM donne 15 bits; mieux vaut utiliser $RANDOM$RANDOM:


Quel interêt ?
Si ce sont des nombres pseudo-aléatoires, dont l'un dépend du précédent,
celà réduit la période et ne laisse que 14 bits de liberté.

Et dans le but de désordonner, 15 bits, c'est bien suffisant.


Ça dépend du nombre de ligne.

Si on a beaucoup plus que 2^15 lignes, (ou pas beaucoup moins), ce qui
va se passer, c'est que plusieurs lignes auront le même numéro
aléatoire et alors sort va alors ordonner ces groupes de façon non
aléatoire.


--
__Pascal_Bourguignon__
http://www.informatimago.com/
Do not adjust your mind, there is a fault in reality.
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Stephane CHAZELAS
Pour des fichiers pas trop gros, un seul awk suffit:

awk < fichier '{a[n++]=$0}END{for(srand();n--;a[i]=b){
b=a[n];a[n]=a[i=int(rand()*NR)]};while(++n<NR)print a[n]}

Sinon, passer par

awk < fichier 'BEGIN{srand()}{print rand(),$0}'
| sort -k1,1 | cut -d -f2-

--
Stéphane
Avatar
Rakotomandimby M A
Rakotomandimby wrote:

merci beaucoup pour votre aide .
J'ai notè tous vos conseils mais je ne peux pas les appliquer , je n'ai
pas la machine sous la main ... grrr je vous tiens au courant.
Et merci encore.