Sélection de lignes avec AWK

Résolu
bulluk Messages postés 8 Statut Membre -  
bulluk Messages postés 8 Statut Membre -
Bonjour,

C'est une question surement simple pour beaucoup
mais je n'arrive pas à m'en dépatouiller avec les différents autres sujets dans le forum:
je ne veux récupérer que les 2 première lignes pour chacune des valeurs du premier champ.

Je m'explique: sous UNIX et avec AWK je souhaite
faire la liste des 2 plus gros fichiers par utilisateur pour un répertoire donné.
Je pars pour cela d'un fichier qui contient la liste triée de tous les
fichiers de ce répertoire avec comme champ user, taille du fichier et chemin absolu
vers le fichier.

exemple
toto 50 /rep/fichier1
toto 40 /rep/fichier2
toto 30 /rep/fichier3
...
tata 25 /rep/fichier1
tata 10 /rep/fichier2
tata 5 /rep/fichier3
...

et je voudrais obtenir dans l'idéal:
"Les 2 plus gros fichiers de l'utilisateur toto sont:
toto 50 /rep/fichier1
toto 40 /rep/fichier2

Les 2 plus gros fichiers de l'utilisateur tata sont:
tata 25 /rep/fichier1
tata 10 /rep/fichier2
"

Merci d'avance pour votre aide.
Configuration: UNIX AIX

3 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Une façon de faire :
    jp@MDK:~/tmpfs ssh$ cat exemple.txt
    toto 50 /rep/fichier1
    toto 40 /rep/fichier2
    toto 30 /rep/tata/fichier3
    tata 25 /rep/fichier1
    tata 10 /rep/fichier2
    tata 5 /rep/fichier3
    titi 50 /rep/toto/fichier1
    titi 30 /rep/fichier2
    titi 20 /rep/fichier3
    tutu 50 /rep/fichier1
    tutu 30 /rep/titi/fichier2
    tutu 20 /rep/fichier3
    
    jp@MDK:~/tmpfs ssh$ cat foo.sh
    #! /bin/bash
    
    for name in $(awk '{ print $1 }' exemple.txt | sort -u)
    do
    echo "Les 2 plus gros fichiers de l'utilisateur $name sont :"
    egrep -m 2 "^$name" exemple.txt
    echo
    done
    
    jp@MDK:~/tmpfs ssh$ ./foo.sh
    
    Les 2 plus gros fichiers de l'utilisateur tata sont :
    tata 25 /rep/fichier1
    tata 10 /rep/fichier2
    
    Les 2 plus gros fichiers de l'utilisateur titi sont :
    titi 50 /rep/toto/fichier1
    titi 30 /rep/fichier2
    
    Les 2 plus gros fichiers de l'utilisateur toto sont :
    toto 50 /rep/fichier1
    toto 40 /rep/fichier2
    
    Les 2 plus gros fichiers de l'utilisateur tutu sont :
    tutu 50 /rep/fichier1
    tutu 30 /rep/titi/fichier2
    
    jp@MDK:~/tmpfs ssh$
    ;-))
    1
    1. bulluk Messages postés 8 Statut Membre
       
      C'est tout simplement parfait!

      Un grand merci et un grand bravo à commentçàmarche qui devient vraiment incontournable quand on développe!
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    une méthode avec awk
    awk '{if(x[$1] == 0)printf("Les 2 plus gros fichiers de l'utilisateur %s sont:\n", $1) ; if(x[$1] < 2) {x[$1]++ ; print $0}}' < fichier.txt
    1
    1. bulluk Messages postés 8 Statut Membre
       
      Hello Dubcek,

      Je savais bien que l'on pouvait tout faire avec AWK ;-)

      Encore un grand merci à vous tous et à une prochaine.
      0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    L'emploi de "awk" est un impératif ?
    0
    1. bulluk Messages postés 8 Statut Membre
       
      Hello jipicy (l'incontournable éleveur du forum AWK),

      Il n'y a pas de souci pour utiliser autre chose que awk mais il y a juste un détail qui peut être embêtant pour l'utilisation de grep par exemple: il y a des cas où l'utilisateur toto a des fichiers avec le nom de l'utilisateur tata dedans . Par exemple:

      toto 50 /rep/Exemple/tata/fichier1

      Un grand merci.

      Un jeune pigouin
      0
      1. tiboux > bulluk Messages postés 8 Statut Membre
         
        man head
        0
      2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > tiboux
         
        Nan, c'est un peu plus prise de tête quand même ;-))
        0