Forum Programmation.shell compter et comparer des chaines de carctères

Posté par  .
Étiquettes : aucune
0
21
juin
2006
bonjour,

Je voudrais pouvoir afficher les utilisateurs qui apparaissent plus de trois fois dans un fichier texte.

Exemple de fichier :

15/05/2006 user1
05/06/2006 user2
18/06/2006 user2
18/06/2006 user2
18/06/2006 user1
19/06/2006 user3
19/06/2006 user1
19/06/2006 user3


J'essaye à coup de grep et de wc -l mais je ne m'en sort pas :(
J'aurais besoin d'un coup de pouce si c'était possible. merci
  • # Un script vite fait et pas forcément le plus propre

    Posté par  . Évalué à 4.

    le log est dans ref.txt

    1) je liste les user
    2) pour tous les users, j'affiche le nom et OK si + de 3

    On peut voir à mettre des variables un peu partout :)

    #!/bin/sh

    USER=`cut -d" " -f2 ref.txt | sort | uniq`

    for i in $USER
    do
    echo $i

    [[ `grep $i ref.txt | wc -l` > 2 ]] && echo "OK"
    done
    • [^] # Re: Un script vite fait et pas forcément le plus propre

      Posté par  . Évalué à 2.

      il est vraiment très intéressant ce script : c'est exactement ce que je cherchais à faire. Merci beaucoup

      Je ne connaissais pas la commande uniq... merci :)
      • [^] # smaller, faster, better

        Posté par  (site web personnel) . Évalué à 5.

        $ sort +1 fichier | uniq -c -d -f 1 | grep -v '^[= =]*2 '

        pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

        • [^] # Re: smaller, faster, better

          Posté par  . Évalué à 4.

          Et le sort -u ca le fait pas?

          sinon en awk:

          awk '
          {
          USER[$2]++
          }
          END {
          for (User in USER) {
          if (USER[User] >= 3) {
          print User
          }
          }
          }' toto.txt

        • [^] # Re: smaller, faster, better

          Posté par  . Évalué à 2.

          Allez je propose aussi ma version :

          sort +1 fichier | uniq -c -f 1 | awk -F " " '{if ($1>=3) print $3}'
          • [^] # Re: smaller, faster, better

            Posté par  (site web personnel) . Évalué à 3.

            Alors si c'est pour utiliser awk, je préfère largement la version du monsieur au dessus. Sinon en Perl...
            $ perl -ane'print "$F[1]\n" if $s{$F[1]}++ == 2' < pwait

            pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

        • [^] # Re: smaller, faster, better

          Posté par  . Évalué à 2.

          Tiens, j'ai appris plein de nouvelle option à sort :) et d'ab, c'est vrai que j'extrais des champs, j'les compte pas (pour le -c uniq :) ), déformation professionnelle :)

          Bon, +1 me dit dépréciated :), maintenant c'est -k

          Sinon, le grep marche mais que si on a au moins 2 entrées, parcec que si il n'y en a qu'une ! alors elle apparait!

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.