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.

#26 Le 15/08/2012, à 17:22

no_spleen

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Argh, en effet. J'avais oublié que les indices en awk sont toujours des strings. Donc 11 < 2.

On peux régler le problème en rajoutant un "z" devant la taille du mot si celui-ci fait plus de 9 lettres (je poste qu'il n'y a pas de mots de plus de 99 lettres...)

{
  for (i=1;i<=NF;i++) 
  {
    longueur = (length(length($i))>1)?"z" length($i):length($i)
    if (!(longueur in taille))
    {   
       taille[longueur]=$i
       place[$i]=i
    }   
  }
  n = asorti(taille,n_ordre)
  for (i=0;i<nb_max;i++)
  {
    word = taille[n_ordre[n-i]]
    unsorted[place[word]]=word
  }
  m = asorti(unsorted,m_ordre)
  sorted = ""
  for (i=1;i<=m;i++)
    sorted=(i==1)?unsorted[m_ordre[i]]:sorted"_"unsorted[m_ordre[i]];
  print sorted

  delete taille
  delete place
  delete n_ordre
  delete m_ordre
  delete unsorted
}

Hors ligne

#27 Le 15/08/2012, à 18:07

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

@ no_spleen #26 :
Allez, encore un petit effort…:P

$ gawk -f split_titles.awk1 -v nb_max=5  <<<"ceci est une phrase à tester pour voir la performance en temps"
ceci_performance_temps_est_phrase

Hors ligne

#28 Le 15/08/2012, à 18:55

no_spleen

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

pingouinux, tu es doué pour appuyer la où cela fait mal ;-)

Je suis curieux de savoir où se situe awk par rapport au shell ou au python au niveau performance.

{
  for (i=1;i<=NF;i++) 
  {
    longueur = (length(length($i))>1)?"z" length($i):length($i)
    emplacement = (length(i)>1)?"z"i:i
    if (!(longueur in taille))
    {   
       taille[longueur]=$i
       place[$i]=emplacement
    }   
  }
  n = asorti(taille,n_ordre)
  for (i=0;i<nb_max;i++)
  {
    word = taille[n_ordre[n-i]]
    unsorted[place[word]]=word
  }
  m = asorti(unsorted,m_ordre)
  sorted = ""
  for (i=1;i<=m;i++)
    sorted=(i==1)?unsorted[m_ordre[i]]:sorted"_"unsorted[m_ordre[i]];
  print sorted

  delete taille
  delete place
  delete n_ordre
  delete m_ordre
  delete unsorted
}

Hors ligne

#29 Le 15/08/2012, à 19:09

grim7reaper

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Bien meilleur que Bash (sans surprise, après tout awk est spécialisé dans ce genre de traitement), mais plus lent que Python :

$ time ./pingouinux.sh TEST 3 > /dev/null
real    1m43.276s
user    0m32.158s
sys     0m9.273s
$ time gawk -f no_spleen.awk -v nb_max=3 TEST > /dev/null
real    0m0.285s
user    0m0.280s
sys     0m0.004s
$ time ./pingouinux.py TEST 3 > /dev/null
real    0m0.145s
user    0m0.140s
sys     0m0.008s

Hors ligne

#30 Le 15/08/2012, à 19:27

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

@ no_spleen #28 :
Les mots sont maintenant dans l'ordre, mais ce ne sont pas que les plus longs qui sont choisis.

$ gawk -f split_titles.awk2 -v nb_max=5  <<<"ceci est une phrase à tester pour voir la performance en temps"
ceci_est_phrase_performance_temps

On devrait obtenir :

ceci phrase tester performance temps

Les performances sont excellents (à comparer aux résultats que je donne en #8).
Traitement global du fichier de 16384 lignes

$ time gawk -f split_titles.awk2 -v nb_max=5  <i >jawk

real	0m0.598s
user	0m0.590s
sys	0m0.000s

Traitement ligne par ligne du même fichier

$ time while read lig  ; do gawk -f split_titles.awk2 -v nb_max=5 <<<"$lig"; done <i >jawkboucle

real	1m19.863s
user	0m0.950s
sys	0m4.150s

Hors ligne

#31 Le 15/08/2012, à 19:34

no_spleen

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

@pinguinux

La règle était que si plusieurs mots ont la même taille, on prend le premier. Ici phrase à la même taille que tester.

Hors ligne

#32 Le 15/08/2012, à 20:00

thurston

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

Bon, j'ose et je me permets.
Le 1er script me permet de choisir les bons mots d'une phrase. Mon display est trop petit malgré tout, et il faut compacter les mots trouvés.
Si le coeur vous en dit, ca se trouve ici, et c'est du coup la partie 2 de la reduction drastique d'une phase à quelques caractères, en reconnaissant toujours la phrase initiale si connue!!!
(utilité? > mp3 player low display)
Ici donc
post
En tous les cas un grand merci à tous
Thurston

Hors ligne

#33 Le 15/08/2012, à 20:31

pingouinux

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

@ no_spleen #31 :
On n'a pas compris la même chose. Pour moi, on choisit d'abord les mots les plus longs, que les longueurs soient identiques ou non; ensuite seulement, s'il y en a de trop, on ne conserve que les premiers de la série de mots les plus courts (parmi les longs qui ont été choisis).
Tout ça n'est pas bien grave, l'essentiel étant que thurston ait eu une réponse à sa question. Il semble d'ailleurs qu'il y ait une suite.

Hors ligne

#34 Le 15/08/2012, à 21:08

thurston

Re : [RESOLU] Reduire une phrase jusqu'à n mots avec les mots les + longs

désolé pour le manque de précision dans l'énoncé du pb posé. C'était la compréhension de pingouinux qui refletait ma pensée.
J'espère que la partie 2 (autre post) est claire car pas forcément simple à expliquer.
Le but ultime de tout ca, c'est de pouvoir reconnaitre avec 5 char un artiste.
Sonic Youth ca donne S.Yo avec 4, et c'est bien différent de Dinosaur.Jr qui donne lui D.Jr (quand n_char est pair), je donne plus au 2ème...
A l'utilisation sur un petit mp3 de ce type MP30WOM (Mpman), c'est redoutable au niveau efficacité, malgré la non gestion des tag (pas cher!!! pas d'ID3-Tag). le lecteur 10 euros, une carte de 32Go uSD, et zou. Pas lecture ni synchro des 32Go gagné, à condition de pouvoir naviguer dans les folders
A+, merci à tous
T.

Hors ligne