Juin 142011
 

ce script permet de rechercher un mot dans une liste sauf que le résultat n’est pas le mot tant recherché, mais une liste des mots s’y rapprochant.

bon, c’est pas parfait mais ça fonctionne plutôt bien, il manque un truc que j’aimerais bien rajouter si j’ai du temps, c’est l’inversion des caractères pour corriger certaines fautes de typo.

Download : exhaustive_research.sh#!/bin/ksh -a
#
###############################################################################
###
# Auteur: Cedrick Gaillard
# Version 0.5.0
# Contributeurs: Cedrick Gaillard
#
# 0.4.0 07-jun-07: Creation
# 0.5.1 07-sep-07: correction d’un calcul mal ecrit (caractere ‘}’ en trop).
# 0.6.0 08-jul-08: modification du message de resultat de la recherche
#
###############################################################################

# principe de la recherche:
# en dessous de TAILLE_MIN on ne recherche pas
#
# en dessous de TAILLE_MAX on effectue une recherche restrictive, chaque
# caractere est successivement remplace par un ‘.’ et le mot a rechercher est
# entoure par les delimiteurs ‘debut’ et ‘fin’ de ligne.
# exemple de masque de recherche pour le mot ‘123’:
# « ^.23$|^1.3$|^1.3.$ »
#
# au dessus de TAILLE_MAX on passe a l’etape superieure, le champ de recherche
# est beaucoup plus grand.
# il n’y a pas de delimiteur ‘debut’ et ‘fin’ de ligne, la recherche est
# exhaustive.
# chaque caracteres est successivement remplace par un ‘.’
# si dans le mot a rechercher il y a plusieurs fois le meme caractere, en ce
# cas il y a substitution des caracteres identiques par un ‘.’
# masque de recherche pour le mot ‘12345678’
# « .2345678|1.345678|12.45678|123.5678|1234.678|12345.78|123456.8|1234567. »
# masque de recherche pour le mot ‘11234456’
# « ..23..56|..23..56|…3..56|..2…56|..23..56|..23..56|..23…6|..23..5. »
# masque de recherche pour le mot ‘compteur’ <== plus parlant surement # ".ompteur|c.mpteur|co.pteur|com.teur|comp.eur|compt.ur|compte.r|compteu." # # le tout est finalement parse avec egrep. # ############################################################################### DICTIONNAIRE=$1 MOT_A_RECHERCHER="$2" TAILLE_MIN=3 TAILLE_MAX=4 # sous solaris, seul l'expr du rep /usr/ucb fonctionne PATH="/usr/ucb:/usr/xpg4/bin:/bin/usr/bin:/$PATH" TMPFILE=/tmp/$$.${0##*/}.$RANDOM mkdir -p $TMPFILE NAME_ALL="$(cat ${DICTIONNAIRE}|egrep -v "^$|^#")" LONGUEUR_DU_MOT="$(echo $MOT_A_RECHERCHER |nawk '{print length($0)}')" cp /dev/null $TMPFILE/test_length cp /dev/null $TMPFILE/test_length_duplicate if [ "$LONGUEUR_DU_MOT" -ge "$TAILLE_MIN" -a "$LONGUEUR_DU_MOT" -le "$TAILLE_MAX" ] then POSITION_DU_POINT=0 occurence= while [ 1 ] do [ -n "$occurence" ] && echo "^${occurence}$" [ "$POSITION_DU_POINT" -eq "$LONGUEUR_DU_MOT" ] && break POSITION_DU_POINT="$((${POSITION_DU_POINT}+1))" [ "$POSITION_DU_POINT" -eq "1" ] && { occurence=".$(expr substr $MOT_A_RECHERCHER 2 $LONGUEUR_DU_MOT)" continue } [ "$POSITION_DU_POINT" -eq "$LONGUEUR_DU_MOT" ] && { occurence="${occurence}." continue } start_first=1 stop_inter=$((${POSITION_DU_POINT}-1)) start_inter=$((${POSITION_DU_POINT}+1)) stop_last=$((${LONGUEUR_DU_MOT}-${POSITION_DU_POINT})) first_block=$(expr substr $MOT_A_RECHERCHER $start_first $stop_inter) last_block=$(expr substr $MOT_A_RECHERCHER $start_inter $stop_last) occurence="${first_block}.${last_block}" done >>$TMPFILE/test_length
elif [ « $LONGUEUR_DU_MOT » -gt « $TAILLE_MAX » ]
then
# y a-t’il des lettres identiques dans le mot a rechercher ?
POSITION_DANS_MOT=0
while [ 1 ]
do
[ « $POSITION_DANS_MOT » -eq « $LONGUEUR_DU_MOT » ] && break
POSITION_DANS_MOT= »$((${POSITION_DANS_MOT}+1)) »

printf « $(expr substr $MOT_A_RECHERCHER $POSITION_DANS_MOT 1)\n »
done |sort |uniq -d >$TMPFILE/test_length_duplicate

# calcul des possibilites
POSITION_DU_POINT=0
while [ 1 ]
do
[ « $POSITION_DU_POINT » -eq « $LONGUEUR_DU_MOT » ] && break
POSITION_DU_POINT= »$((${POSITION_DU_POINT}+1)) »

POSITION_DANS_MOT=0 #on remet le compteur a zero a chaque fois
occurence=

while [ 1 ]
do
[ « $POSITION_DANS_MOT » -eq « $LONGUEUR_DU_MOT » ] && break
POSITION_DANS_MOT= »$((${POSITION_DANS_MOT}+1)) »

[ « $POSITION_DU_POINT » -eq « $POSITION_DANS_MOT » ] && occurence= »${occurence}. » && continue

lettre_en_cours= »$(expr substr $MOT_A_RECHERCHER $POSITION_DANS_MOT 1) »
if [ « $(egrep -ic « ^${lettre_en_cours}$ » $TMPFILE/test_length_duplicate) » = « 1 » ]
then
occurence= »${occurence}. »
continue
fi

[ « $POSITION_DU_POINT » -ne « $POSITION_DANS_MOT » ] && occurence= »${occurence}${lettre_en_cours} »
done

echo « $occurence » >>$TMPFILE/test_length
done
fi

if [ « $LONGUEUR_DU_MOT » -ge « $TAILLE_MIN » ]
then
final_research_value=
while read research_value
do
[ -z « $final_research_value » ] && final_research_value= »$research_value » && continue
final_research_value= »${final_research_value}|$research_value »
done <$TMPFILE/test_length DEBUG exhaustive_research "[$final_research_value]" RESULT_EX_RESEARCH="$(echo "${NAME_ALL}" |egrep -i "$final_research_value" |tr "\n" " ")" [ -n "$RESULT_EX_RESEARCH" ] && { echo "voici une liste d'elements se rapprochant de votre recherche:" echo " $RESULT_EX_RESEARCH" } fi rm -r $TMPFILE [/bash]

bien sûr ce script est très largement améliorable et optimisable.

 Laisser un commentaire

Vous pouvez utiliser ces tags et attributs HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(requis)

(requis)

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.