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 POSIX Discussion :

Compter le nombre de caractères de chaque ligne d'un fichier


Sujet :

Shell et commandes POSIX

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 42
    Points : 60
    Points
    60
    Par défaut Compter le nombre de caractères de chaque ligne d'un fichier
    Bonjour
    J'ai un soucis avec mon code shell
    J'ai un fichier qui contient des codes

    Fichier1
    OHE
    COZ
    CEIUBC
    CBZ
    Je voudrais parcourir toutes les lignes du fichier et compter le nombre de caractères. Si le nombre de caractère est égal à 3 je continue le traitement sinon je sort en erreur
    Voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while read line
    do
     
    nbr=$(echo "$line" | wc -l)
    if [ $nbr -eq 3 ]
       then
          echo  " Format du fichier Param Valide"
    else 
          echo  " Format du fichier Param InValide"
      fi
      done
    fi
    Je compte sur votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 396
    Points
    28 396
    Par défaut
    Pourquoi faire si compliqué ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ! grep -vq '^...$' Fichier1
    then
      echo  " Format du fichier Param Valide"
    else 
      echo  " Format du fichier Param InValide"
    fi
    Par ailleurs, c'est wc -c pour compter le nombre de caractères .
    wc -l compte les lignes

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 42
    Points : 60
    Points
    60
    Par défaut
    Merci pour ta réponse mais wc -c compte le nombre de caractére dans tout le fichier alors que dans mon cas j'ai juste besoin de compter le nb caractéres de chaque ligne.
    Sinon je viens de tester avec ta solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if [ ! grep -vq '^...$' $fichier2 ]
    then
    echo " Format du fichier Param Valide"
    else
    echo " Format du fichier Param InValide"
    fi
    Comme erreur, j'ai eu ceci
    -vq: unknown test operator

    Je crois qu'il n'a pas aimé le syntaxe de ma condition if

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Moi302 Voir le message
    Merci pour ta réponse mais wc -c compte le nombre de caractére dans tout le fichier alors que dans mon cas j'ai juste besoin de compter le nb caractéres de chaque ligne.
    Oops! Que de confusions!

    wc -c compte le nombre de caractères dans ce qu'il reçoit sur son entrée standard, c'est-à-dire, dans le cas présent, dans une ligne.
    Alors que wc -l compte le nombre de caractères dans ce qu'il reçoit sur son entrée standard, c'est-à-dire, dans le cas présent, dans une ligne. Du coup, s'il retourne autre chose que 1, je veux bien manger mon chapeau (en effet, chaque ligne contient une ligne (logique, non?)).

    Sinon je viens de tester avec ta solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if [ ! grep -vq '^...$' $fichier2 ]
    then
    echo " Format du fichier Param Valide"
    else
    echo " Format du fichier Param InValide"
    fi
    Comme erreur, j'ai eu ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -vq: unknown test operator
    Je crois qu'il n'a pas aimé le syntaxe de ma condition if
    Ben oui!
    Tu n'as as pas testé avec la solution d'al1_24, mais avec une adaptation personnelle... qui ne fonctionne pas très bien!
    En fait, tu as ajouté des crochets là où il n'en faut pas!
    Du coup, c'est équivalent à un 'test'... et 'test' n'aime pas du tout le '-vq' qui ne ressemble à aucun opérateur connu de 'test', d'où le message!
    Essaie plutôt avec le vrai code fourni par al1_24.

    Sinon, juste pour corriger ton code initial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while read line
    do
     
    nbr=$(echo "$line" | wc -l)
    if [ $nbr -eq 3 ]
       then
          echo  " Format du fichier Param Valide"
    else 
          echo  " Format du fichier Param InValide"
      fi
      done # PAS BON!
    fi
    Il y a un 'fi' de trop!

    Si c'est le premier (pour respecter le test), dans aucun langage de programmation digne de ce nom (même FORTRAN, je crois), tu ne peux intriquer de cette manière deux structures de contrôle!
    D'ailleurs, l'éditeur que tu utilises devrait te le dire et rouspéter sur l'indentation!
    Pour faire bref, il faut fermer le 'fi' avant le 'done':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while read line ; do
        nbr=$(echo "$line" | wc -c) # Pour compter le nombre de caractères de la ligne
        if [ $nbr -eq 3 ]
        then echo  " Format du fichier Param Valide pour la ligne ${line}"
        else 
            echo  " Format du fichier Param InValide (${nbr} caractères dans la ligne '${line}')"
            break # Pour sortir du while
        fi
    done
    Attention! Je donne ce code corrigé juste pour que tu comprennes ce qui ne fonctionnait pas, mais je ne le recommande pas!
    D'autres solutions bien meilleures ont été proposées.

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Bonsoir.

    Cette syntaxe est valide en bash et ksh et probablement dans d'autres shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while read ligne; do 
        if [ ${#ligne} -eq 3 ]; then
            echo "Ligne valide ! Je continue ..."
        else
            echo "Ligne invalide ! Je sort en erreur"
            exit 1 # Pour sortir en erreur
        fi
    done < fichier.txt
    L'avantage ici, c'est qu'on a pas besoin de faire appel à des commandes externes : grep, wc, etc.

    Sinon dans ton code de départ, hormis toutes les erreurs qui ont été relevée, je constate qu'il manque également ton fichier en entrée

    Cordialement,
    Idriss

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 42
    Points : 60
    Points
    60
    Par défaut Compter le nombre de caractères de chaque ligne d'un fichier
    Merci pour vos réponses
    J'ai testé avec ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while read ligne
     do 
        if [ ${#ligne} -ne 3 ] 
         	then
    	    	echo " Format du Centre "$ligne" invalide "
    			return 1 
        else
            echo " Format des centre du fichier "$fichier2" Correcte "
     
        fi
    done < $fichier2
     
      fi
    Cette méthode marche très bien, par contre comme je suis dans une boucle, quand j'ai 10 lignes correcte dans mon fichier, c'est à dire 10 lignes qui respectent le format, il m'affiches 10 fois le message " Format des centre du fichier "$fichier2" Correcte "
    Je veux l'afficher qu'une seule fois sur la console. Est ce possible avec la commande echo ???
    Merci d'avance

  7. #7
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Bonjour.

    Ou est la difficulté ?

    Il suffit d'un peu de réflexion algorithmique de base, pas besoin d'aller chercher systématiquement une option magique dans une commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while read ligne; do 
        if [ ${#ligne} -ne 3 ]; then
            echo "Format du centre $ligne invalide !"
            exit 1 # Je préfère au return quand on est pas dans une fonction
            # (ça quittera le script en erreur, sinon si ça n'est pas le comportement voulu, il faudra rajouter une condition dans le while, c'est le plus propre)
        fi
    done < $fichier2
     
    echo "Format des centre du fichier $fichier2 correct."
    Sinon merci de faire attention à indenter ton code mieux que ça

    Cordialement,
    Idriss

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 42
    Points : 60
    Points
    60
    Par défaut
    Merciiii ça marche, mon probleme est résolu
    Et désolé pour l'indentation du code, j'y penserai la prochaine fois
    Encore Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/01/2014, 16h42
  2. Compter le nombre de caractères dans le titre d'un fichier
    Par jerem7286 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 02/11/2013, 14h47
  3. [Débutant] Compter le nombre de caractères d'une ligne
    Par niepoc dans le forum MATLAB
    Réponses: 4
    Dernier message: 25/04/2008, 14h10
  4. Réponses: 15
    Dernier message: 28/02/2007, 10h00
  5. Réponses: 13
    Dernier message: 20/11/2006, 17h46

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