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 :

trier et enlever les doublons en Shell


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Par défaut trier et enlever les doublons en Shell
    Bonjour,

    je souhaitais savoir comment faire pour transformer le fichier liste.txt suivant :

    antony;034;
    antony sud;034;
    paris;075;
    antony;034;
    massy;091;
    savigny;034;

    en

    antony / antony sud / savigny;034
    paris;075;
    massy;091;

    Ainsi il faut :
    -supprimer les doublons
    -mettre à la suite les villes ayant même numéro en rajoutant le numéro à la fin

    Merci du coup de main

    Seb

  2. #2
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Tri avec élimination des doublons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sort -u -t";" -k2,2 -k1,1 liste.txt
    Pour la suite, les commandes cut ou awk peuvent t'être utiles.
    Propose une ébauche de script et on verra¨

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    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
    #!/bin/bash
    # tri
    sort -u -t ";" -k 2 -k 1 ton-fichier | \
     
    # traitement awk
    awk '
    BEGIN {FS = OFS = ";"}
    {
            sep = code[$2] ? "/" : ""
            code[$2] = code[$2] sep $1
    }
     
    END {
            for (i in code) {
                    print code[i], i
            }
    }
    '

  4. #4
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    ripat, ma solution awk n'aurait pas été aussi concise

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Merci. Les tableaux awk permettent beaucoup de choses. Mais, en testant le code ci-dessus je suis tombé sur une particularité des tableaux awk qui m'a perturbé un peu. Les indices des tableaux awk sont associatifs. Les indices numériques sont ainsi d'abord transformés en chaînes de caractères. Donc, si on entre un élément: tableau[75]="Paris", le 75 sera transformé en chaîne selon le format %.6g. Mais si on entre les éléments: tableau[075]="Paris"; tableau[61]="Là-bas"

    Si on fait un print tableau[075] on aura "Là-bas" comme résultat. Etonnant non? Awk transforme les nombres en chaînes *sauf* si ce nombre est un octal valide! Et, l'octal 075 donne 61 en base décimale!
    Octal and hexadecimal constants (see Nondecimal-numbers) are converted internally into numbers, and their original form is forgotten.
    Le genre de piège à perdre du temps!

  6. #6
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Par défaut Merci ! mais comment ça marche ?
    Salut !

    Merci beaucoup pour ce code qui marche super

    Par contre je débute en shell et je ne comprends pas ce que font les lignes :

    sep = code[$2] ? "/" : ""

    et

    print code[i], i

    quelqu'un pourrait-il m'expliquer ??

    Merci

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

Discussions similaires

  1. [ArrayList] Enlever les doublons
    Par GLDavid dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 13/05/2012, 02h43
  2. Comment trier un tableau pour enlever les doublons ?
    Par MuLog dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 18/03/2009, 20h54
  3. Enlever les doublons en fonction de la date
    Par nicko5959 dans le forum Access
    Réponses: 2
    Dernier message: 10/01/2006, 14h13
  4. [SQL] Enlever les doublons par rapport a une colonne
    Par irenee dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/12/2005, 19h23
  5. [array] enlever les doublons
    Par FFF dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 01/11/2005, 10h43

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