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 :

uniq -ci


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 8
    Points : 6
    Points
    6
    Par défaut uniq -ci
    Bonsoir,

    j'ai plusieurs fichiers contenant des listes de mots et le nombre d'occurence de chaque terme, et dans chaque fichier j'ai par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     155 Je
      59  avoir
      23  parler 
    ...etc
    J'ai utilisé cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat *.txt > tous.txt | sort | uniq -ci  | sort -k3
    pour mettre toutes les listes dans un seul fichier et les trier en ordre et j'ai utilisé uniq -c pour enlever les doublons et aussi pour calculer l'occurence. Mais uniq n'a pas enlever les doublons et ne calcule pas l'occurence correctement par exemple j'ai eeu comme résultats
    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
       2       1 bête
          2       1 bêtise
          1       1 bible
          2       1 biblique
          1      10 bien
          1      11 bien
          1      12 bien
          1      28 bien
          1       3 bien
          1       4 bien
          1       6 bien
          3       2 bien
          5       1 bien
          1       1 bienfaisance
          1       1 bien-fondé
          3       1 bientôt
    Mais moi ce que je veux c'est d'avoir cette liste comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     1 bêtise
     1 bible
     1 biblique
     77 bien
     1 bienfaisance
     1 bien-fondé
     1 bientôt

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

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

    à partir du moment où tu rediriges la sortie de cat vers un fichier , le premier sort ne reçoit rien en entrée, ainsi que le reste du pipe.

    les commandes que tu utilises n'effectueront aucun calcul, et c'est ce que tu sembles souhaiter obtenir : la somme du nombre d'occurrences de chaque mot dans l'ensemble des fichiers.

    tu dois utiliser un langage qui gère les tableaux associatifs : bash, ksh (tous ?), zsh, awk, python...
    on pourrait aussi le faire avec deux tableaux indexés...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    comme dit au dessus la redirection n'est pas au bon endroit, on peut aussi faire sauter le cat superflu, et la colonne sur laquelle trier est possiblement la 2 et non la 3
    ce qui à l'arrivée donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort *.txt | uniq -ci | sort -k2 > resultat.txt
    sinon avec un autre langage genre awk, mais ça n'apporte pas grand chose de plus pour le coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{tab[$1]++} END {for (i in tab){printf("%7d %s\n", tab[i], i) | "sort -k2"}}' *.txt > resultat.txt
    edit: j'ai peut-être mal compris l'histoire de la redirection, s'il s'agit d'effectuer uniquement le traitement, pas besoin de mixer tous les fichiers en un, on peut tout faire à la volée comme illustré
    s'il faut malgré tout effectuer le traitement d'une part ET merger tous les fichiers d'autre part, on peut toujours utiliser la commande tee
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat *.txt | tee -a tous.txt | sort | uniq -ci | sort -k2

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    DreamAT semble vouloir additionner le nombre d'occurrences des mots de tous les fichiers.

    soit deux fichiers ex1 et ex2 :
    Code ex1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    12 ça
    5 pas
    1 va
    Code ex2 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    7 ça
    1 mais
    6 si
    2 va
    le résultat attendu, devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    19 ça
    1 mais
    5 pas
    6 si
    3 va
    difficile de comprendre les intentions d'un OP quand les extraits de fichiers qu'il fournit ne correspondent pas !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    ah oui ok, effectivement j'avais rien pané à l'affaire

    du coup via awk, un truc comme ça doit faire le job :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{tab[$2]+=$1} END {for(i in tab){printf("%7d %s\n", tab[i], i) | "sort -k2"}}' *.txt

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    je crois pas que c'est problème de colonne le probème est que je veux que les occurences de tous les mots soient additionner

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    oui exactement c'est ca je veux qu'il additionnes les occurence déja existants

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 822
    Points : 7 117
    Points
    7 117
    Par défaut
    Je trouve que cet exercice pourrait trouver sa solution par les tables de hachage.

    En gros, pour essayer d'être concis,

    Pour chaque fichier, on crée sa table de hachage avec comme clé le mot et comme valeur le nombre d'occurrence.
    Ajouter toutes les clés de toutes les tables de hachage dans un array puis on crée un autre tableau représentant les clés uniques.
    Créer une nouvelle table de hachage avec les clés qui seront les clés uniques précédemment définies, puis initialiser les valeurs à 0.
    Pour chaque clé unique, pour la table de hachage de chaque fichier, vérifier l'existence de la clé, si elle existe, y ajouter la valeur de cette clé.

    Exercice qui n'est pas aussi simple qu'il en a l'air... Ne maîtrisant que très peu le bash, je laisse les pros

    Sinon il y a d'autres langages qui s'y prêtent bien concernant les dictionnaires, comme python, ruby, ...

    Bonne continuation !
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 725
    Points
    12 725
    Par défaut
    C'est ce que fait déjà le awk de BufferBob mais en passant directement par le tableau de hash final, il a juste rajouter un sort -k2 pour faire un trie, car comme tous les langages, dés qu'il s'agit d'un hash, on ne connait pas l'ordre.

    En gawk, on pourrait se passer du tri en initialisant la variable PROCINFO["sorted_in"]="@ind_str_asc", mais là, on est vraiment sur du spécifique gawk (gnu awk).

    PS: en voyant ton lien, l'exercice en pur built-in bash serait interressant en effet
    Cordialement.

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

Discussions similaires

  1. Requête POST dans un script bash
    Par desperado dans le forum Linux
    Réponses: 4
    Dernier message: 11/12/2007, 22h38
  2. Cours sur le bash
    Par Kleb dans le forum Linux
    Réponses: 7
    Dernier message: 16/08/2004, 14h40
  3. Extraire des lignes d'un fichier en commande bash
    Par newnew dans le forum Linux
    Réponses: 3
    Dernier message: 27/07/2004, 16h22
  4. Bash et fichiers
    Par localhost dans le forum Linux
    Réponses: 12
    Dernier message: 30/06/2004, 07h11
  5. Bash vs MySQL
    Par localhost dans le forum Linux
    Réponses: 3
    Dernier message: 28/06/2004, 10h48

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