Problème avec Sort -Unix -débutant

Résolu/Fermé
JsuisNul - 23 nov. 2010 à 14:47
 JsuisNul - 25 nov. 2010 à 19:01
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

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 nov. 2010 à 16:44
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 ??
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
24 nov. 2010 à 12:23
Malheureusement non, c'est l'ordre alphabétique ;-((
0
spacm Messages postés 141 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 30 août 2016 30
23 nov. 2010 à 15:31
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)
0
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.
0
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
24 nov. 2010 à 15:04
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...

;-))
0
Merci,

je vais tester et vous faire un retour !

:oD
0
excuse moi, est-ce que je peux te demander la commande pour l'enlever ensuite ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
Modifié par zipe31 le 24/11/2010 à 17:46
sed -i.orig 's/ /\x08&/' fichier

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

mv -f nom_fichier.ext.bak nom_fichier.ext
0
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
25 nov. 2010 à 13:50
Pour mettre l'indice :

sed 's/;/1&/'

Pour l'enlever :

sed 's/;/\x08&/'
0