Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/09/2011, 14h33   #1
Invité de passage
 
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 2
Points : 2
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 :
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
baba915 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/09/2011, 15h44   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
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 :
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_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/09/2011, 20h13   #3
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
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...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/09/2011, 20h30   #4
Invité de passage
 
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 2
Points : 2
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
baba915 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/09/2011, 22h40   #5
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
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 :
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.
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 12/09/2011, 09h30   #6
Invité de passage
 
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 2
Points : 2
Merci beaucoup, c'est très gentil !!
baba915 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h36.


 
 
 
 
Partenaires

Hébergement Web