Problème avec Sort -Unix -débutant

Résolu
Bonjour,

Je vous explique mon problème.
J'ai un script ou je concatène des fichiers sur lesquels je fais ensuite un sort puis pour toutes les lignes doubles, je supprime une des deux lignes.
Mon soucis est que je n'arrive pas supprimer la bonne ligne ou bien je n'arrive pas à trier de tels sorte que la ligne que je souhaite garder soit toujours en deuxième.

Voila un exemple :

Fichier 1

Matricule nom prenom ville date témoin
A1234 Dupont Pierre Paris 01/11/2010 L
B5678 Pondu jean Paris 01/11/2010 F
C4321 Durant Paul Lyon 12/10/2010 L
D9876 Randu Eric Marseille 26/02/2010 L
E6541 Jardin Léa Toulouse 16/08/2010 F

Fichier 2

A1234 Dupont Pierre Cologne 01/11/2010 F

cat Fichier 2 >> Fichier 1
Resultat:

Fichier 1

Matricule nom prenom ville date témoin
A1234 Dupont Pierre Paris 01/11/2010 L
B5678 Pondu jean Paris 01/11/2010 F
C4321 Durant Paul Lyon 12/10/2010 L
D9876 Randu Eric Marseille 26/02/2010 L
E6541 Jardin Léa Toulouse 16/08/2010 F
A1234 Dupont Pierre Cologne 01/11/2010 F

sort -o Fichier 3 -K 1 Fichier 1
Resultat:

Fichier 3

Matricule nom prenom ville date témoin
A1234 Dupont Pierre Cologne 01/11/2010 F
A1234 Dupont Pierre Paris 01/11/2010 L
B5678 Pondu jean Paris 01/11/2010 F
C4321 Durant Paul Lyon 12/10/2010 L
D9876 Randu Eric Marseille 26/02/2010 L
E6541 Jardin Léa Toulouse 16/08/2010 F

cat Fichier 3| awk -F";" '/Matricule/ {print $0;next} ; {x[$1]=$0} ; END{for( n in x)print x[n]}' > Fichier 4

Resultat:

Fichier 4

Matricule nom prenom ville date témoin
A1234 Dupont Pierre Paris 01/11/2010 L
B5678 Pondu jean Paris 01/11/2010 F
C4321 Durant Paul Lyon 12/10/2010 L
D9876 Randu Eric Marseille 26/02/2010 L
E6541 Jardin Léa Toulouse 16/08/2010 F

Alors que j'aurais voulu avoir pour le premier matricule "A1234" lal ligne
A1234 Dupont Pierre Cologne 01/11/2010 F

J'ai essayer de concatener dans un autre ordre mais le trie s'éffectue toujours de la même façon.

Si quelqu'un connais la solution à mon problème Merci !! (Jipicy je compte sur toi ;o))
en espérant avoir été clair,

J.

5 réponses

  1. Contributeur
    Salut,

    En partant sur ton fichier 3 :

    $ cat fich
    A1234 Dupont Pierre Paris 01/11/2010 L
    B5678 Pondu jean Paris 01/11/2010 F
    C4321 Durant Paul Lyon 12/10/2010 L
    D9876 Randu Eric Marseille 26/02/2010 L
    E6541 Jardin Léa Toulouse 16/08/2010 F
    A1234 Dupont Pierre Cologne 01/11/2010 F
    
    $ sort -k 1 fich | uniq -w 5
    A1234 Dupont Pierre Cologne 01/11/2010 F
    B5678 Pondu jean Paris 01/11/2010 F
    C4321 Durant Paul Lyon 12/10/2010 L
    D9876 Randu Eric Marseille 26/02/2010 L
    E6541 Jardin Léa Toulouse 16/08/2010 F
    
    $

    ;-))
    1. Merci Zipe31,

      Avec ta commande, ce qui détermine le choix de la bonne ligne c'est l'ordre de concaténation ??
    2. Contributeur
      Malheureusement non, c'est l'ordre alphabétique ;-((
  2. tu utilises un tableau associatif pour faire le ménage.
    ligne 1:
    x[A1234]= A1234 Dupont Pierre Cologne 01/11/2010 F
    ligne 2:
    x[A1234]=A1234 Dupont Pierre Paris 01/11/2010 L
    celui de cologne se trouve éliminé.

    si tu trie ton fichier dans l'autre sens, ça devrais résoudre le problème
    sort -o Fichier 3 -rK 1 Fichier 1
    (-r pour reverse)
    1. Merci pour cette réponse rapide !!!

      J'ai fait le test est ça fonctionne sauf que je me rend compte que le tri reste aléatoire à savoir que le tri se fait sur l'ensemble de de la ligne.
      pour faire plus simple :
      moi je souhaite que ce soit toujours la ligne du fichier 2 qui soit conserver.
      or je me rend compte que le tri ne se fait pas forcement comme suit:
      ligne fichier 1
      ligne fichier 2
      mais plutot par ordre aphalbétique. Si par exemple on a:
      ligne fichier 1 : A1234,bbbbb
      ligne fichier 2 : A1234,abbbb

      Si je fais un sort, j'aurai :

      ligne fichier 2: A1234,abbbb
      ligne fichier 1: A1234,bbbbb

      donc même si j'inverse, je ne serai jamais sur d'avoir garder la ligne du fichier 2.

      Donc Help ME !!!!!

      merci beaucoup.
      1. Merci pour vos différentes réponses et solutions.
        Etant donné que je dans tous les cas je ne peux pas avoir un contrôle sur l'ordre du trie, je me suis dis que je pouvais dans ce cas le forcer moi-même en ajoutant un indice juste après le matricule.
        mon matricule étant unique j'aurai donc ainsi et en limitant la clé du tri sur le matricule jusuq'à l'indice:

        Fichier 1

        Matricule nom prenom ville date témoin
        A1234 Dupont Pierre Paris 01/11/2010 L
        B5678 Pondu jean Paris 01/11/2010 F
        C4321 Durant Paul Lyon 12/10/2010 L
        D9876 Randu Eric Marseille 26/02/2010 L
        E6541 Jardin Léa Toulouse 16/08/2010 F

        Fichier 2

        A1234 Dupont Pierre Cologne 01/11/2010 F

        ici commande pour rajouter l'indice
        Fichier 1

        Matricule nom prenom ville date témoin
        A12341 Dupont Pierre Paris 01/11/2010 L
        B56781 Pondu jean Paris 01/11/2010 F
        C43211 Durant Paul Lyon 12/10/2010 L
        D98761 Randu Eric Marseille 26/02/2010 L
        E65411 Jardin Léa Toulouse 16/08/2010 F

        Fichier 2

        A12342 Dupont Pierre Cologne 01/11/2010 F

        puis cat Fichier 2 >> Fichier 1

        Resultat:

        Fichier 1

        Matricule nom prenom ville date témoin
        A12341 Dupont Pierre Paris 01/11/2010 L
        B56781 Pondu jean Paris 01/11/2010 F
        C43211 Durant Paul Lyon 12/10/2010 L
        D98761 Randu Eric Marseille 26/02/2010 L
        E65411 Jardin Léa Toulouse 16/08/2010 F
        A12342 Dupont Pierre Cologne 01/11/2010 F

        sort -o Fichier 3 -K 1 6 Fichier 1
        Resultat:

        Fichier 3

        Matricule nom prenom ville date témoin
        A12341 Dupont Pierre Paris 01/11/2010 L
        A12342 Dupont Pierre Cologne 01/11/2010 F
        B56781 Pondu jean Paris 01/11/2010 F
        C43211 Durant Paul Lyon 12/10/2010 L
        D98761 Randu Eric Marseille 26/02/2010 L
        E65411 Jardin Léa Toulouse 16/08/2010 F

        cat Fichier 3| awk -F";" '/Matricule/ {print $0;next} ; {x[$1]=$0} ; END{for( n in x)print x[n]}' > Fichier 4

        Resultat:

        Fichier 4

        Matricule nom prenom ville date témoin
        A12342 Dupont Pierre Cologne 01/11/2010 F
        B56781 Pondu jean Paris 01/11/2010 F
        C43211 Durant Paul Lyon 12/10/2010 L
        D98761 Randu Eric Marseille 26/02/2010 L
        E65411 Jardin Léa Toulouse 16/08/2010 F

        ici commande pour retirer les indices

        A1234 Dupont Pierre Cologne 01/11/2010 F
        B5678 Pondu jean Paris 01/11/2010 F
        C4321 Durant Paul Lyon 12/10/2010 L
        D9876 Randu Eric Marseille 26/02/2010 L
        E6541 Jardin Léa Toulouse 16/08/2010 F

        maintenant reste plus qu'a savoir comment mettre et retirer cette indice.

        Vous en penser quoi ? quelqu'un peut m'éclairer sur l'ecriture de ces deux commande ?

        Merci d'avance.
        1. Contributeur
          Re-

          Avec "sed" :

          $ cat plop
          A1234 Dupont Pierre Paris 01/11/2010 L
          B5678 Pondu jean Paris 01/11/2010 F
          C4321 Durant Paul Lyon 12/10/2010 L
          D9876 Randu Eric Marseille 26/02/2010 L
          E6541 Jardin Léa Toulouse 16/08/2010 F
          
          $ sed  -i.bak 's/ /1&/' plop
          
          $ cat plop
          A12341 Dupont Pierre Paris 01/11/2010 L
          B56781 Pondu jean Paris 01/11/2010 F
          C43211 Durant Paul Lyon 12/10/2010 L
          D98761 Randu Eric Marseille 26/02/2010 L
          E65411 Jardin Léa Toulouse 16/08/2010 F
          
          $

          Le ".bak" sert à créer une copie du fichier original (renommer en nom_fichier.ext.bak) au cas ou...

          ;-))
          1. Merci,

            je vais tester et vous faire un retour !

            :oD
          2. excuse moi, est-ce que je peux te demander la commande pour l'enlever ensuite ?
          3. Contributeur
            sed -i.orig 's/ /\x08&/' fichier

            Ou si tu as créer le fichier.bak :

            mv -f nom_fichier.ext.bak nom_fichier.ext
          4. Hello,

            j'ai fait des test et je n'arrive pas à faire fonctionner ton sed. En regardant de plus près,
            j'ai vu que j'avais oublié un détail important (peut être). Mes fichiers sont des fichiers CSV avec comme séparateur de ";" au lieu des espaces comme sur mes exemples.
            Cela ne change t-il pas les choses en sachant que je veux mettre un indice à la fin du premier champs de chaque ligne ?

            Merci d'avance.
          5. Contributeur
            Pour mettre l'indice :

            sed 's/;/1&/'

            Pour l'enlever :

            sed 's/;/\x08&/'