Problème avec Sort -Unix -débutant
Résolu
JsuisNul
-
JsuisNul -
JsuisNul -
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.
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.
A voir également:
- Problème avec Sort -Unix -débutant
- Aucun son ne sort de mon pc - Guide
- Logiciel de programmation pour débutant - Guide
- Logiciel montage vidéo débutant - Guide
- Son qui sort du téléphone et des écouteurs bluetooth - Forum Xiaomi
- Je branche mes écouteurs mais le son sort du téléphone iphone - Forum iPhone
5 réponses
Salut,
En partant sur ton fichier 3 :
;-))
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 $
;-))
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)
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)
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.
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.
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re-
Avec "sed" :
Le ".bak" sert à créer une copie du fichier original (renommer en nom_fichier.ext.bak) au cas ou...
;-))
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...
;-))
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.
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.
Avec ta commande, ce qui détermine le choix de la bonne ligne c'est l'ordre de concaténation ??