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

 

Etiquettes: 

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.