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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 8
    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 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    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 confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    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 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    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 confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    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
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

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

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 107
    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 : 4 107
    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 !

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 8
    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

+ 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