Comparer 2 champs sur lignes differentes

Résolu
papavers Messages postés 24 Statut Membre -  
papavers Messages postés 24 Statut Membre -
Bonjour à tous,

Voilà j'ai un fichier à 3 colonnes. Pour les lignes dont le 1er champ est identique je dois faire une comparaison sur le champ 3 et garder une seul ligne (la ligne ayant la date la plus recente). Pour faciliter le travail j'ai d'abord effectuer un sort -n.

Exemple

acs101 linus>cat test
205321505 5 21/06/2009
205321505 7 25/05/2009
202003245 2 12/05/2009
205432152 5 14/07/2009
206434434 5 12/07/2009
206434434 5 18/07/2009
acs101 linus>

le fichier output test1 devra etre

205321505 5 21/06/2009
202003245 2 12/05/2009
205432152 5 14/07/2009
206434434 5 18/07/2009

Merci à tous
Configuration: Windows XP
SeaMonkey 1.1.15

13 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Avec uniq et cut tu peux extraire les clés (première colonne).
    (mando@aldur) (~) $ cat pouet
    205321505 5 21/06/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009
    205432152 5 14/07/2009
    206434434 5 12/07/2009
    206434434 5 18/07/2009 
    
    (mando@aldur) (~) $ cat pouet | cut -f1 -d' ' | uniq
    205321505
    202003245
    205432152
    206434434
    

    Avec un grep tu peux extraire les lignes pour une clé donnée (que je note x dans ce qui suit) à chaque clé ainsi extraite. En appliquant au grep un sort en ne conservant que la dernière ligne avec un tail on obtient le résultat désiré.
    (mando@aldur) (~) $ for x in `cat pouet | cut -f1 -d' ' | uniq`; do grep $x pouet | sort | tail -n 1; done
    205321505 7 25/05/2009
    202003245 2 12/05/2009
    205432152 5 14/07/2009
    206434434 5 18/07/2009 

    Version sous forme d'un script (sans doute plus lisible) :
    #!/bin/bash
    for x in `cat pouet | cut -f1 -d' ' | uniq`;
    do
        grep $x pouet | sort | tail -n 1;
    done
    

    Pour plus de détails :
    man cut
    man uniq
    man sort
    man tai
    man grep

    Bonne chance
    0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    A essayer :
    [tmpfs]$ cat plop
    
    205321505 5 21/06/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009
    205432152 5 14/07/2009
    206434434 5 12/07/2009
    206434434 5 18/07/2009

    [tmpfs]$ sort -r +0 -1 -k 3.4,3.6 -k 3.1,3.3 plop | sort -ru +0 -1
    206434434 5 18/07/2009
    205432152 5 14/07/2009
    205321505 5 21/06/2009
    202003245 2 12/05/2009

    [tmpfs]$
    ;-))

    Édit : Y'a du rififi dans la mise en page comme qui dirait ;-(((
    Les sauts de lignes n'existent pas en réalité ;-(
    0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Ah c'est même mieux que ce que j'ai fait avec ton sort, car je viens de percuter qu'avec juste un sort (comme j'ai fait sur le résultat du grep) on trie en priorité sur la colonne 2 puis sur le jour, puis sur le mois, et enfin sur l'année ce qui ne correspond pas au résultat que papavers souhaite.

    En fait je n'avais jamais fait gaffe qu'on pouvait faire tout ça avec sort.
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Et bien plus encore ;-))
      0
  4. papavers Messages postés 24 Statut Membre 1
     
    Merci à vous Mamiemando et Jipicy.

    Comme tu l'as dit Mamiemando on ne recuperait pas forcement la ligne voulue.
    Et c'est plus performant en utilisant juste le sort, car avec un tres gros fichier, utiliser grep n'est pas avantageux.

    Je teste de suite.

    A toute.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. papavers Messages postés 24 Statut Membre 1
     
    Salut Jipicy,

    En testant ta commande je n'obtiens pas le même résultat,

    acs104 linus>cat test.2
    205321505 5 21/06/2009

    205321505 7 25/05/2009

    202003245 2 12/05/2009

    205432152 5 14/07/2009

    206434434 5 12/07/2009

    206434434 5 18/07/2009
    acs104 linus>sort -r +0 -1 -k 3.4,3.6 -k 3.1,3.3 test.2 | sort -ru +0 -1
    206434434 5 18/07/2009
    205432152 5 14/07/2009
    205321505 7 25/05/2009 (je devrais avoir 205321505 5 21/06/2009, plus récente date)
    202003245 2 12/05/2009

    acs104 linus>

    Bon A +
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Quel système ? Ou distrib ? Quel shell ?

    Parce que chez moi avec un copier:coller de ton fichier "test2" :
    [tmpfs]$ cat toto
    
    205321505 5 21/06/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009
    205432152 5 14/07/2009
    206434434 5 12/07/2009
    206434434 5 18/07/2009
    [tmpfs]$ sort -r +0 -1 -k 3.4,3.6 -k 3.1,3.3 toto | sort -ru +0 -1
    206434434 5 18/07/2009
    205432152 5 14/07/2009
    205321505 5 21/06/2009
    202003245 2 12/05/2009
    [tmpfs]$
    ?? ;-\
    0
  8. papavers Messages postés 24 Statut Membre 1
     
    Eh ben!

    Je suis sous solaris korn shell.

    acs104 root#cat /etc/release
    Solaris 8 HW 7/03 s28s_hw3wos_05a SPARC
    Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
    Assembled 11 June 2003
    acs104 root#
    0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ben là je ne peux plus rien pour toi, n(ayant pas de quoi testé dans un environnement comme le tien.

    J'ai trouvé ça, si ça peut t'aider...
    http://www.softpanorama.org/Tools/sort.shtml
    http://docs.sun.com/app/docs/doc/817-3936/6mjgdbvid?a=view
    0
  10. papavers Messages postés 24 Statut Membre 1
     
    Merci pour les adresses, j'etais déja sur l'une d'elles.

    Je vous tiens informé dès que j'ai une amélioration

    A +
    0
  11. papavers Messages postés 24 Statut Membre 1
     
    Là j'ai ajouter un autre sort sur l'année ( au cas ou ce serait different).

    En fait sur le dernier sort il prend en compte la valeur de la colonne 2 :

    acs104 linus>cat test.3
    205321505 5 21/06/2009
    205321505 7 25/05/2009

    202003245 2 12/05/2009
    205432152 5 14/07/2009
    206434434 5 12/07/2009
    206434434 5 18/07/2009
    acs104 linus>

    acs104 linus>cat test.2
    205321505 7 21/06/2009
    205321505 5 25/05/2009

    202003245 2 12/05/2009
    205432152 5 14/07/2009
    206434434 5 12/07/2009
    206434434 5 18/07/2009
    acs104 linus>

    acs104 linus>sort -r +0 -1 -k 3.7,3 -k 3.4,3.5 -k 3.1,3.2 test.3 | sort -ru +0 -1
    206434434 5 18/07/2009
    205432152 5 14/07/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009
    acs104 linus>sort -r +0 -1 -k 3.7,3 -k 3.4,3.5 -k 3.1,3.2 test.2 | sort -ru +0 -1
    206434434 5 18/07/2009
    205432152 5 14/07/2009
    205321505 7 21/06/2009
    202003245 2 12/05/2009
    acs104 linus>
    0
  12. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Un détail chez moi qui a de l'importance, le numéro du caractère utilisé pour la délimitation...
    [tmpfs]$ cat test2
    205321505 5 21/06/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009
    205432152 5 14/07/2009
    206434434 5 12/07/2009
    206434434 5 18/07/2009
    
    [tmpfs]$ sort -r +0 -1 -k 3.7,3 -k 3.4,3.5 -k 3.1,3.2  test2 | sort -ru +0 -1
    206434434 5 18/07/2009
    205432152 5 14/07/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009
    
    [tmpfs]$ sort -r +0 -1 -k 3.7,3 -k 3.4,3.6 -k 3.1,3.3  test2 | sort -ru +0 -1
    206434434 5 18/07/2009
    205432152 5 14/07/2009
    205321505 5 21/06/2009
    202003245 2 12/05/2009
    
    [tmpfs]$  
    ? ;-\
    0
  13. papavers Messages postés 24 Statut Membre 1
     
    Salut Jipicy,

    sous solaris les 2 commandes me donnent le meme resultat.

    acs104 linus>cat test.2
    205321505 5 21/06/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009
    205432152 5 14/07/2009
    206434434 5 12/07/2009
    206434434 5 18/07/2009

    acs104 linus>sort -r +0 -1 -k 3.7,3 -k 3.4,3.5 -k 3.1,3.2 test.2 | sort -ru +0 -1
    206434434 5 18/07/2009
    205432152 5 14/07/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009

    acs104 linus>sort -r +0 -1 -k 3.7,3 -k 3.4,3.6 -k 3.1,3.3 test.2 | sort -ru +0 -1
    206434434 5 18/07/2009
    205432152 5 14/07/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009

    Là je vais essayer de voir avec nawk.

    Merci encore
    0
  14. papavers Messages postés 24 Statut Membre 1
     
    Bonjour à tous,

    Finalement j'ai pu avoir une solution, c'est pas vraiment top mais ça me donne le bon résultat

    En fait j'ai remarqué que sous Solaris le contenu du champ 2 influence le dernier sort. J'utilise donc nawk pour changer la position des champs, ensuite j'utilise la commande uniq

    acs201 linus>cat test.3
    205321505 5 21/06/2009
    205321505 7 25/05/2009
    202003245 2 12/05/2009
    205432152 5 14/07/2009
    206434434 5 12/07/2009
    206434434 10 18/05/2009
    acs201 linus>sort -r +0 -1 -k 3.7,3 -k 3.4,3.6 -k 3.1,3.3 test.3 | nawk '{print($2,$3,$1)}' | uniq -n2 | nawk '{print($3,$1,$2)}'
    206434434 5 12/07/2009
    205432152 5 14/07/2009
    205321505 5 21/06/2009
    202003245 2 12/05/2009
    acs201 linus>

    Bon si vous avez une meilleure proposition, suis preneur!!!!!!!!!
    0