Anagrammes
Voici un script qui permet de trouver les anagrammes d'un mot ou d'une suite de lettres.
Ce script utilise un dictionnaire de plus de 336500 mots.
Ce dictionnaire de mots peut être téléchargé ICI.
Il est également disponible ICI au format UTF-8.
Ce script s'utilise de cette manière :
$ anagramme.sh -f fichierDictionnaire [-d] -l nbLettre -c listeLettres
L'option -f permet d'indiquer le fichier "dictionnaire" à utiliser.
L'option -l permet d'indiquer le nombre de lettres des anagrammes à rechercher.
L'option -c permet d'indiquer le mot ou les lettres des anagrammes à rechercher.
L'option -d permet de ne pas prendre en compte les caractères accentués.
Cliquez ICI pour télécharger le script ou via mon GitLab.
Exécution du script :
# ./scripts/anagramme.sh -f liste.de.mots.francais.frgut.txt.utf8 -l 6 -c aspire
Liste des mots de 6 lettre(s) et contenant les lettres "aspire" :
1 - aspire
2 - paires
3 - paries
4 - parsie
5 - repais
# ./scripts/anagramme.sh -f liste.de.mots.francais.frgut.txt.utf8 -l 8 -c fuaaieujoslw
Liste des mots de 8 lettre(s) et contenant les lettres "fuaaieujoslw" :
1 - jalousai
2 - jalousie
Avec l'option -d :
# ./scripts/anagramme.sh -f liste.de.mots.francais.frgut.txt.utf8 -d -l 6 -c aspire
Liste des mots de 6 lettre(s) et contenant les lettres "aspire" :
1 - aspire
2 - aspire
3 - epairs
4 - paires
5 - paries
6 - paries
7 - parsie
8 - repais
Ci-dessous le détail du script avec un maximum de commentaires :
# nl scripts/anagramme.sh
1 #!/bin/bash
2 # Activation du debug
3 # Décommenter pour activer
4 #set -x
5 # Fonction permettant de tester l'existence des commandes passées en argument
6 function preRequis {
7 for arg in $@; do
8 if ! which $arg >/dev/null; then
9 logger -t $0 "La commande $arg n'est pas installée"
10 echo "La commande $arg n'est pas installée !!!"
11 echo "Fin du script."
12 exit 1
13 fi
14 done
15 }
16 # Journalisation de l'exécution du script
17 logger -t $0 "Exécution du script"
18 # Initialisation de la variable PATH
19 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
20 # Exécution de la fonction preRequis
21 preRequis grep sed awk
22 # Vérification du nombre d'arguments passés au script
23 #if [[ ! $# -eq 6 ]]; then
24 if [[ $# -lt 6 || $# -gt 7 ]]; then
25 echo "Nombre d'arguments incorrect"
26 echo "Utilisation : $0 -f fichierDictionnaire [-d] -l nbLettre -c listeLettres"
27 exit 1
28 fi
29 # Suppression des caractères accentués (0 = NON / 1 = OUI)
30 supprAccents=0
31 # Validation des arguments passés au script
32 while getopts ":f:c:l:d" option; do
33 case $option in
34 f)
35 if [ -f "$OPTARG" ]; then
36 LISTE="$OPTARG"
37 else
38 echo "L'option -f requiert un fichier existant."
39 exit 1
40 fi
41 ;;
42 c)
43 listeDesLettres="$OPTARG"
44 if ! grep -E -q -i "^[a-z]*$" <<< "$listeDesLettres"; then
45 echo "L'option -c requiert les lettres [a-z]."
46 exit 1
47 fi
48 ;;
49 l)
50 nbLettre="$OPTARG"
51 if ! grep -E -q "^[0-9]*$" <<< "$nbLettre"; then
52 echo "L'option -l requiert une valeur numérique."
53 exit 1
54 fi
55 ;;
56 d)
57 supprAccents=1
58 ;;
59 :)
60 echo "L'option $OPTARG requiert un argument."
61 exit 1
62 ;;
63 \?)
64 echo "$OPTARG : option invalide."
65 exit 1
66 ;;
67 esac
68 done
69 # Initialisation des variables utilisées pour le script
70 listeDesLettres2="$listeDesLettres"
71 listeDesMots2=""
72 ind=1
73 # Réécriture de la liste des lettres en incluant un pipe entre chaque lettre pour l'utiliser avec la commande grep
74 # abcdef -> a|b|c|d|e|f|
75 listeDesLettres=$(sed -r 's/([a-zA-Z])/\1\|/g' <<< "$listeDesLettres")
76 # Recherche tous les mots contenant le nombre et les lettres indiqués
77 if [[ $supprAccents = "0" ]]; then
78 listeDesMots=$(cat "$LISTE" | grep -E -e "^.{$nbLettre}$" | grep -E -i "^[$listeDesLettres]+$")
79 else
80 listeDesMots=$(cat "$LISTE" | sed 'y/àâäéèêëîïôöùûüç/aaaeeeeiioouuuc/' | grep -E -e "^.{$nbLettre}$" | grep -E -i "^[$listeDesLettres]+$")
81 fi
82 # On parcourt tous les mots trouvés par la commande précédente.
83 # Chaque mot et la liste des lettres sont passés à la commande AWK.
84 # AWK initialise un tableau avec la liste des lettres (avec la commande split).
85 # Chaque lettre est remplacée dans le mot par un blanc avec la commande sub ...
86 # ... et le résultat renvoyé par la commande (1 en cas de succès et 0 en cas d'échec) ...
87 # ... est multiplié à la variable "a". Pour finir, la commande AWK retourne le résultat de la variable "a".
88 # Si la commande AWK retourne "1" (signifiant une erreur en BASH - D'où le "!" après le "if" )
89 # c'est que toutes les lettres du mot correspondent à la liste des lettres à chercher.
90 # On sauvegarde donc le mot en cours dans la variable "listeDesMots2".
91 while read mot; do
92 if ! echo "$mot|$listeDesLettres2" | awk -F'|' 'BEGIN{a=1;b=1}{split($1,tab,"");for(var in tab){b=sub(tab[var],"",$2);a*=b}}END{exit a}'; then
93 listeDesMots2="$listeDesMots2\n$ind - $mot"
94 ind=$(expr $ind + 1)
95 fi
96 done <<< "$listeDesMots"
97 # Affichage de la liste des mots trouvés
98 echo -n "Liste des mots de $nbLettre lettre(s) et contenant les lettres \"$listeDesLettres2\" :"
99 echo -e "$listeDesMots2"
100 # Journalisation de la fin du script
101 logger -t $0 "Fin d'exécution du script"
102 # Fin du script
103 exit 0
Ajouter un commentaire