IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Aide programme Shell Bash


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut Aide programme Shell Bash
    Bonjour tout le monde,

    Je cherche à écrire un programme en shell bash afin de déterminer le pourcentage d'analogie entre ces deux lignes:

    ABCDEFGHIJKL
    ....CDEABCIJKL (les ... sont des blancs) => on a 70% d'identité.

    Je pensais utiliser les boucles for (while),

    en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    n=0 ;
    i=CDEABCIJKL;
     
    while ((i= (il faudrait mettre entre A et L))
    do echo $n;
    (n +=1)
    done
    Qu'en pensez-vous ?
    Je lutte un peu en fait.

    Je vous remercie par avance de votre aide

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    il faudrait "jouer" sur ${paramètre:début:longueur} (en anglais : ${parameter:offset:length}).

    J'ai une préférence pour for, mais c'est faisable avec while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    line1="ABCDEFGHIJKL"
    line2="  CDEFGHIJKL"
    unset match
    for (( n=0; n<${#line1}; n++))
    do [ "${line1:$n:1}" = "${line2:$n:1}" ] && ((match++))
    done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par baba915 Voir le message
    Bonjour tout le monde,

    Je cherche à écrire un programme en shell bash afin de déterminer le pourcentage d'analogie entre ces deux lignes:

    ABCDEFGHIJKL
    ....CDEABCIJKL (les ... sont des blancs) => on a 70% d'identité.
    Salut

    Si tu veux qu'on t'aide, il faut quand-même nous donner les bonnes infos. Déjà pour moi, 7 lettres identiques sur les 12 possibles ne font pas 70 mais 58%. A moins que l'emplacement ne compte pas, et dans ce cas le AB situé au milieu de la seconde ligne pourra être vu comme identique au AB du début de la première mais sans détail sur ta façon de voir, on peut pas grand chose...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    Merci beaucoup.

    Oui les blancs ne comptent pas, et on analyse seulement lettre à lettre (ce qui est comparable), d'ou 7 / 10 .

    Je pense qu'on peut faire avec une boucle for, mais je n'y arrive pas.

    En tout cas merci

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par baba915 Voir le message
    Merci beaucoup.

    Oui les blancs ne comptent pas, et on analyse seulement lettre à lettre (ce qui est comparable), d'ou 7 / 10 .
    A mon avis, tu fais une erreur d'analyse car avec ta façon de compter, alors comparer "ABCDEF" avec "ABX" (2/3) ou avec "ABCDXY" (4/6) donnera le même pourcentage. Alors qu'un pourcentage est sensé être un indicateur de référence (sous-entendu 2 résultats différents ne peuvent pas donner la même valeur).
    Pour moi, il faut donner le nombre de lettres correspondantes par rapport au plus long des deux mots. Dans ce cas, alors comparer "ABCDEF" avec "ABX" (2/6) ne donnera pas le même résultat qu'avec "ABCDXY" (4/6).

    De plus (autre argument), si ta chaine 2 (qui est "....CDEFGHIJKL") devient "..XCDEFGHIJKL" (un blanc devient X), il y a toujours 7 correspondances mais avec ton calcul ça donne 7/11. Bref un calcul dont le résultat change alors que le nombre d'éléments correspondants ne change pas n'est pas super carré...

    Citation Envoyé par baba915 Voir le message
    Je pense qu'on peut faire avec une boucle for, mais je n'y arrive pas.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/bin/sh
     
    ch1="ABCDEFGHIJKL"
    ch2="  CDEABCIJKL"
     
    # Récupération des deux longueurs de chaines
    lg1=$(expr "$ch1" : ".*")
    lg2=$(expr "$ch2" : ".*")
     
    # Evaluation de la chaine la plus longue
    test $lg1 -gt $lg2 && lg=$lg1 || lg=$lg2
     
    # Compteur
    cpt=0
    i=1
    while test $i -le $lg
    do
    	test "$(echo "$ch1" |cut -c$i)" = "$(echo "$ch2" |cut -c $i)" && cpt=$(expr $cpt + 1)
    	i=$(expr $i + 1)
    done
     
    echo $cpt $(echo $cpt \* 100 / $lg |bc -l)%
    Ce code est en pur Bourne Shell car je ne suis pas aussi doué que N_Bah dans l'utilisation des instructions spécifiques bash. Donc lui pourra sûrement l'alléger mais en tout cas il fonctionne.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    Merci beaucoup, c'est très gentil !!

Discussions similaires

  1. Aide programme en SHELL
    Par seanbean dans le forum Linux
    Réponses: 14
    Dernier message: 23/10/2010, 13h11
  2. aide sur programmation shell
    Par devhafid dans le forum Linux
    Réponses: 3
    Dernier message: 27/01/2010, 15h50
  3. Pourquoi la programmation Shell ?
    Par am.adnane dans le forum Linux
    Réponses: 14
    Dernier message: 21/01/2006, 00h47
  4. PERL AIDE PROGRAMMATION
    Par kiza dans le forum Langage
    Réponses: 2
    Dernier message: 17/10/2005, 16h57
  5. Programmation Shell
    Par Leila75 dans le forum Linux
    Réponses: 3
    Dernier message: 12/05/2005, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo