IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Script langstat.sh : demande de conseils et propositions de modification


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 85
    Points : 100
    Points
    100
    Par défaut Script langstat.sh : demande de conseils et propositions de modification
    Bonjour,
    j'ai fait un script pour une évaluation. Je souhaiterais savoir si vous pouviez y jeter un coup d'oeil. Pourriez-vous me dire ce qu'il pourrait être amélioré ? Et comment?
    Merci pour votre aide.
    jakol

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <code sh>#!/bin/bash
     
    # On teste l'existence du premier paramètre (le fichier)
    if [ ! $# -ge 1 ] || [ ! -e $1 ]
    then
        echo 'Fichier de dictionnaire introuvable'
        exit 1
    fi
     
    # On fait un boucle sur les lettres. L'option -i de grep ignore la casse, et l'option -c donne le compte des lignes qui contiennent l'expression. Le tri s'effectue sur la sortie standard de la boucle.
    for lettre in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    do
     
     printf "%s - %s\n" $(grep  -ic $lettre $1)  $lettre 
     
    done | sort -rn 
     
    # On test l'existence d'un deuxième paramètre test
    if [ $# -ge 2 ] && [ $2 = 'test' ]
    then
     shift
     
    # on affiche le message dans la console 
        echo " j'ai testé un deuxième paramètre "
     
    # on affiche le message dans le fichier test.txt
        echo " j'ai testé un deuxième paramètre" >> test.txt
     
        echo " Nombre de lignes dans test.txt : `wc -l test.txt` "
     
    fi 
     
    # On demande si l'on veut supprimer le fichier test.text
    read -p "on supprime test.text ?  oui/non : " reponse
    if [ $reponse =  'oui' ] 
    then
     echo "on supprime le fichier test.txt"
     rm test.txt
     
    else
     echo "on garde le fichier test.txt"
     
    fi</code>
     
    <config>Windows / Chrome 75.0.3770.142</config>

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Alors, grep n'est pas l'idéal ici, car tu dois lire 25 fois ton fichier "$1" pour ton décompte du nombre de fois que l'on rencontre la lettre en question.

    La première chose à faire (et surtout en scripting), c'est de voir à optimiser au maximum le parcours d'un fichier afin de ne le faire au plus qu'une fois quand c'est possible (ce qui est très souvent le cas comme ici).
    Cordialement.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    je pourrais améliorer tellement de choses, mais alors ce ne serait plus ton script !

    tu peux déjà, dans les comparaisons lexicales, mettre les variables entre guillemets.
    et mettre de la cohérence dans les Substitutions de commandes.

    écrire test au lieu de [, -a ou -o au lieu de && et ||...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Si tu veux un exemple, toute ta boucle for .... | sort -rn est remplaçable par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%s - %s\n" $(LC_ALL=C sed -z 's/[^[:alpha:]\s]//g;s/./\l&\n/g' $1 | sort | uniq -c | sort -rn)
    Cordialement.

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 85
    Points : 100
    Points
    100
    Par défaut
    Merci pour le code mais je ne comprends pas bien le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -z 's/[^[:alpha:]\s]//g;s/./\l&\n/g' $1

    sed va filtrer le paramètre $1. il remplace tous les lettres en début de ligne après ...je ne sais pas...Puis on trie les données dans le fichier, on enlève les doublon et on refait un tri dans un ordre inverse

    Après, si vous avez un peu de temps, ce serait cool de me donner des détails sur cette commande.

    Merci encore

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    En fait, je viens de voir une erreur dans mon sed, le \s est de trop dans [^[:alpha:]\s].

    Et j'ai peut-être aussi mal lu ton script:

    Doit il compter le nombre d’occurrences de chaque lettres dans le fichier (ce que fait mon code) ou doit il compter pour chaque lettre le nombre de ligne où elle apparaît (ce que fait ton code) ?
    Cordialement.

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Ma commande sed fait:
    -z ==> spécifique gnu sed (le retour à la ligne n'est plus la fin de ligne mais le caractère NUL ou en écriture standard \0 )
    s/[^[:alpha:]]//g ==> supprime tout les caractères qui ne sont pas de la classe ALPHA (A à Z sans tenir compte de la casse) et comme j'ai forcé la locale à C ( LC_ALL=C ), celle_ci ne prend pas en compte les caractères accentués
    s/./\l&\n/g ==> change les caractères en minuscules et retourne à la ligne pour chacun des caractères.
    Cordialement.

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 85
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    En fait, je viens de voir une erreur dans mon sed, le \s est de trop dans [^[:alpha:]\s].

    Et j'ai peut-être aussi mal lu ton script:

    Doit il compter le nombre d’occurrences de chaque lettres dans le fichier (ce que fait mon code) ou doit il compter pour chaque lettre le nombre de ligne où elle apparaît (ce que fait ton code) ?
    (en ce qui concerne le SED) Il doit compter le nombre d’occurrences de chaque lettres dans le fichier

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Bah, toute la ligne fait le job:
    Le sed ne garde que les lettres de a à z et met une lettre par ligne, puis le sort est là uniquement pour la commande uniq qui a besoin que les lignes soient triées pour fonctionner correctement.
    Cordialement.

Discussions similaires

  1. demande de conseil pour optimiser mon script
    Par seb.garcia dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 11/05/2011, 16h03
  2. [SGBD] demande de conseil sur script util (FPDF et mysql_insert_id)
    Par mangafan dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/10/2005, 00h57
  3. [Struts_Tiles VS CSS] Demande de Conseils
    Par sylvain_neus dans le forum Struts 1
    Réponses: 4
    Dernier message: 16/04/2004, 10h12
  4. [sqlbaseserver]demande de conseils/aides pour requêtes
    Par GéniuS77 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 18/03/2004, 17h27
  5. demande de conseil
    Par stephane eyskens dans le forum EDI/Outils
    Réponses: 2
    Dernier message: 25/09/2003, 14h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo