Blame view

anagramme.sh 3.8 KB
a25cfce8b   root   ajout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  #!/bin/bash
  
  # Activation du debug
  # Décommenter pour activer
  #set -x
  
  # Fonction permettant de tester l'existence des commandes passées en argument
  function preRequis {
          for arg in $@; do
                  if ! which $arg >/dev/null; then
  			logger -t $0 "La commande $arg n'est pas installée"
                          echo "La commande $arg n'est pas installée !!!"
                          echo "Fin du script."
                          exit 1
                  fi
          done
  }
  
  # Journalisation de l'exécution du script
  logger -t $0 "Exécution du script"
  
  # Initialisation de la variable PATH
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
  
  # Exécution de la fonction preRequis
  preRequis grep sed awk
  
  # Vérification du nombre d'arguments passés au script
  #if [[ ! $# -eq 6 ]]; then
  if [[ $# -lt 6 || $# -gt 7 ]]; then
  	echo "Nombre d'arguments incorrect"
  	echo "Utilisation : $0 -f fichierDictionnaire [-d] -l nbLettre -c listeLettres"
e863e6ce9   root   787cd1c9-6c2f-492...
33
  	echo "L'option -d permet de ne pas prendre en compte les accents."
a25cfce8b   root   ajout
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  	exit 1
  fi
  
  # Suppression des caractères accentués (0 = NON / 1 = OUI)
  supprAccents=0
  
  # Validation des arguments passés au script
  while getopts ":f:c:l:d" option; do
  	case $option in 
  		f)
  			if [ -f "$OPTARG" ]; then
  				LISTE="$OPTARG"
  			else
  				echo "L'option -f requiert un fichier existant."
  				exit 1
  			fi
  			;;
  		c)
  			listeDesLettres="$OPTARG"
  			if ! grep -E -q -i "^[a-z]*$" <<< "$listeDesLettres"; then 
  				echo "L'option -c requiert les lettres [a-z]."
  				exit 1
  			fi
  			;;
  		l)
  			nbLettre="$OPTARG"
  			if ! grep -E -q "^[0-9]*$" <<< "$nbLettre"; then
  				echo "L'option -l requiert une valeur numérique."
                                  exit 1
  			fi
  			;;
  		d)
  			supprAccents=1
  			;;
  		:)
  			echo "L'option $OPTARG requiert un argument."
  			exit 1
  			;;
  		\?)
  			echo "$OPTARG : option invalide."
  			exit 1
  			;;
  	esac
  done
  
  # Initialisation des variables utilisées pour le script
  listeDesLettres2="$listeDesLettres"
  listeDesMots2=""
  ind=1
  
  # Réécriture de la liste des lettres en incluant un pipe entre chaque lettre pour l'utiliser avec la commande grep
  # abcdef -> a|b|c|d|e|f|
  listeDesLettres=$(sed -r 's/([a-zA-Z])/\1\|/g' <<< "$listeDesLettres")
  
  # Recherche tous les mots contenant le nombre et les lettres indiqués
  if [[ $supprAccents = "0" ]]; then
  	listeDesMots=$(cat "$LISTE" | grep -E -e "^.{$nbLettre}$" | grep -E -i "^[$listeDesLettres]+$")
  else
  	listeDesMots=$(cat "$LISTE" | sed 'y/àâäéèêëîïôöùûüç/aaaeeeeiioouuuc/' | grep -E -e "^.{$nbLettre}$" | grep -E -i "^[$listeDesLettres]+$")
  fi
  
  # On parcourt tous les mots trouvés par la commande précédente.
  # Chaque mot et la liste des lettres sont passés à la commande AWK.
  # AWK initialise un tableau avec la liste des lettres (avec la commande split).
  # Chaque lettre est remplacée dans le mot par un blanc avec la commande sub ...
  # ... et le résultat renvoyé par la commande (1 en cas de succès et 0 en cas d'échec) ...
  # ... est multiplié à la variable "a". Pour finir, la commande AWK retourne le résultat de la variable "a".
  # Si la commande AWK retourne "1" (signifiant une erreur en BASH - D'où le "!" après le "if" ) 
  # c'est que toutes les lettres du mot correspondent à la liste des lettres à chercher.
  # On sauvegarde donc le mot en cours dans la variable "listeDesMots2".
  while read mot; do
  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 
  	listeDesMots2="$listeDesMots2
  $ind - $mot"
  	ind=$(expr $ind + 1)
  fi
  done <<< "$listeDesMots"
  
  # Affichage de la liste des mots trouvés
  echo -n "Liste des mots de $nbLettre lettre(s) et contenant les lettres \"$listeDesLettres2\" :"
  echo -e "$listeDesMots2"
  
  # Journalisation de la fin du script
  logger -t $0 "Fin d'exécution du script"
  
  # Fin du script
  exit 0