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 :

Problème pour compter occurence chiffres / nombres


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Problème pour compter occurence chiffres / nombres
    Bonjour,

    Je dois traiter un fichier texte qui ne contient que des chiffres sur plusieurs lignes et colonnes. Le but du traitement sur ce fichier c'est de compter les chiffres qui ont la même valeur.

    Pour cela j'ai trouvé :

    $ grep -c "valeur_chiffre" fichier

    Le problème c'est que si par exemple une valeur possède par exemple 125 , une autre 5 et une autre 155, les résultats seront différents selon la recherche : si je cherche l'occurence 55 , j'aurais une occurence. Si je cherche 5, j'en aurais trois...

    Alors je me suis un peu renseigné, je suis allé voir chez perl qui propose des choses aussi mais mon but c'était de ne pas trop me lancer dans le language de programmation et de traiter ça assez simplement avec un language natif sous linux.

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour,

    imaginons que ton motif s'appelle $motif. Tu peux faire un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ motif=5
    $ cat /tmp/test
    125
    5
    155
    $ grep -o $motif /tmp/test |wc -l
    4
    $ motif=55; grep -o $motif /tmp/test |wc -l
    1
    [edit] Après, il y a une question que tu n'as pas tranchée: 555 contient-il une fois ou deux fois le motif 55 ? [/edit]
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    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
    Bonjour,

    Peux-tu être plus explicite sur ton problème:
    Tu dois faire ça sur une colonne particulière ?

    Car si tu as un nombre qui se repete plusieurs fois sur la même ligne, grep ne te retournera que 1 pour cette ligne.

    Après,pour pouvoir t'aider simplement, il faudrait savoir à quoi ressemble ton fichier d'entrée.
    Cordialement.

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour,

    imaginons que ton motif s'appelle $motif. Tu peux faire un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ motif=5
    $ cat /tmp/test
    125
    5
    155
    $ grep -o $motif /tmp/test |wc -l
    4
    $ motif=55; grep -o $motif /tmp/test |wc -l
    1
    [edit] Après, il y a une question que tu n'as pas tranchée: 555 contient-il une fois ou deux fois le motif 55 ? [/edit]


    Voilà le genre de tableau que je dois traiter :

    50 141 527
    141 712 1251
    856 4 5
    824 4 7
    5555 14 57
    23852 78 559

    et si je prends comme $motif=55 il va en trouver trois alors qu'il y en a aucun; il va compter comme ceci : 5555 (un 55 en gras, un 55 souligné et un 55 en italique). Cela ne répond malheureusement pas à ce que je recherche et j'ai bien peur de devoir toucher à de la programmation, ça m'ennuie beaucoup. Il faudrait pouvoir dire que lorsque la commande s'exécute, la chaine de caractère lu est entière dès qu'elle est séparée d'un espace, ce qui complique vraiment les choses (du moins à mon niveau)

  5. #5
    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
    Voici une petite ligne awk:
    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
    $ cat fic.txt
    50 141 527
    141 712 1251
    856 4 5
    824 4 7
    5555 14 57
    23852 78 559
    $ awk '{for (i=1;i<=NF;i++) {A[$i]++}}END{for (i in A){print i"="A[i]}}' fic.txt
    4=2
    5=1
    7=1
    14=1
    50=1
    57=1
    78=1
    141=2
    527=1
    559=1
    712=1
    824=1
    856=1
    1251=1
    5555=1
    23852=1
    Cordialement.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -wc $motif mon_fichier
    Ca retourne bien 0 pour 55 dans le cas que tu donnes.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    mdr.

    Merci, ça semble être la solution à mon problème...

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Pour information, l'option -w <valeur> de grep ne traite que les occurences de valeur en tant que mot (Word), c'est a dire précédé et suivi d'un espace, underscore, point, etc etc etc.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    La vraie question n'a jamais été clairement et correctement énoncée.
    Le but du traitement sur ce fichier c'est de compter les chiffres
    Faux. Le but est de compter les nombres. Pas les chiffres.
    Le problème c'est que si par exemple une valeur possède par exemple 125 , une autre 5 et une autre 155, les résultats seront différents selon la recherche : si je cherche l'occurence 55 , j'aurais une occurence. Si je cherche 5, j'en aurais trois...
    J'imagine que les points de suspensions signifient qu'il y a un problème.
    D'abord, je ne vois pas le problème: la commande a fait ce que tu lui a demandé.
    Ensuite, ce doit être : 4 occurrences du 5 et non 3 occurences.
    et si je prends comme $motif=55 il va en trouver trois alors qu'il y en a aucun;
    Il y en 3 ou 4 suivant la façon de considérer, question à laquelle tu n'as pas répondu.
    il va compter comme ceci : 5555 (un 55 en gras, un 55 souligné et un 55 en italique).
    Ton analyse est fausse. Il trouve 5555 et 559 une ligne plus bas.

    Bref. La prochaine fois, pose ta question correctement.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Et d'ailleurs, en relisant la question, je me rends compte que grep -w n'est pas forcement la solution...

    Dans cet exemple, qu'attends-tu comme resultat pour une recherche sur la chaine 55 :

    ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

Discussions similaires

  1. hash pour compter occurence dans un fichier
    Par Nifaste dans le forum Langage
    Réponses: 2
    Dernier message: 07/11/2011, 16h55
  2. Webi - Problèmes pour compter
    Par Amarox dans le forum Débuter
    Réponses: 2
    Dernier message: 17/03/2011, 10h54
  3. probléme pour rentrer des chiffres dans un textbox
    Par sky88 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 21/08/2009, 11h20
  4. Réponses: 9
    Dernier message: 30/01/2007, 21h03
  5. Problème pour compter les lignes d'un résultat
    Par Yoshidu62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/07/2006, 11h18

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