Blame view
anagramme.sh
3.73 KB
a25cfce8b 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 33 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 |
#!/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" 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 |