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 sur 2 colonnes ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut uniq sur 2 colonnes ?
    Bonjour,

    J'ai un fichier classement.txt contenant sur chaque ligne deux informations :

    1) le nom du joueur
    2) son score

    à chaque fois qu'on execute mon script celui-ci demande d'entrer un nom et ensuite ce dernier, suivi du score, est envoyé >> dans classement.txt que je trie ensuite sur la deuxième colonne (pour établir un classement des joueurs).

    Le problème c'est qu'un joueur qui va jouer n fois se retrouvera n fois dans le classement, alors que je ne voudrais conserver que le meilleur score. Comment faire ?

    J'ai pensé appliquer uniq à la première colonne mais la deuxième ne suivra pas aussi... Voici mon code :

    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
    #!/bin/bash
    read -p " Entre ton nom d'utilisateur" name
    echo "Recopiez le plus vite possible la phrase suivante : je suis le plus rapide"
    echo "Quand vous etes pret tapez sur entree"
    read entree
    DEBUT=$(date +%s%N)
    read texte
    FIN=$(date +%s%N)
    let NANO="$FIN-$DEBUT"
    let SECONDES="$NANO/1000000000"
    let MICRO="($NANO-1000000000*$SECONDES)/1000000"
    if [ "$texte" = "je suis le plus rapide" ]
    then
        echo "tu as mis $SECONDES secondes et $MICRO ms"
    else 
        echo "tu as fait des fautes de frappe"
    fi
    let TEMPS="1000*$SECONDES+$MICRO"
    CLASS=classement.txt
    CLASSTEMP=.classement2
    echo "$name,$TEMPS" >> $CLASS
    sort -t "," -n -k 2 $CLASS > $CLASSTEMP
    cp $CLASSTEMP $CLASS
    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    bonjour,

    j'ai vu ça aujourd'hui.
    à adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    echo "bob 123
    alex 354
    bob 654
    alex 321
    bob 456" | sort -rn -k2,2 | awk '! a[$1]++'
    bob 654
    alex 354
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut
    Bonjour,

    pourquoi est-ce que ça ne fonctionne pas dans mon sh ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CLASS=classement.txt
    CLASSTEMP=.classement2
    echo "$name,$TEMPS" >> $CLASS
    cat $CLASS | sort -n -k2,2 | awk '! a[$1]++' > $CLASSTEMP
    cp $CLASSTEMP $CLASS
    Merci de ton aide

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    parce que tu n'indiques pas de séparateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort -t ',' -n -k2,2 $Class | awk -F ',' '! a[$1]++' > $ClassTemp
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut
    Impeccable !

    Donc que fait la commande suivante au juste ? D'après le man -F c'est pour le séparateur mais le reste je ne sais pas.

    Une autre question concernant mon script :

    Peut-on empêcher le joueur de copier coller la phrase à taper ? (pour éviter les tricheries). Ou empêcher que le sh prenne en argument < triche.txt où le fichier triche contiendrait le nom de l'utilisateur et la phrase.

    Merci à toi

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut
    Tu n'as pas d'idée? Ce n'est peut-être pas possible...

Discussions similaires

  1. Grep Uniq sur colonne dans un fichier CSV en KSH
    Par luckythrice dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 08/07/2009, 20h26
  2. DBGrid - Affichage sur 2 colonnes
    Par Grouik dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/04/2004, 17h37
  3. doublon et trie sur autre colonne
    Par Force59 dans le forum Requêtes
    Réponses: 10
    Dernier message: 01/04/2004, 09h02
  4. Trigger sur une colonne ?
    Par hpalpha dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 14h16
  5. Check sur une colonne de table "en cours"
    Par in dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/07/2003, 09h47

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