Unix -débutant-supprésion ligne dans fichier

Résolu/Fermé
JsuisNul - 3 nov. 2010 à 11:30
 JsuisNul - 29 nov. 2010 à 14:20
Bonjour à tous,

Je suis débutant en unix comme certains le savent déjà ici ( Jipicy ou Dubcek pour ne citer qu'eux ;oP). J'espère ne pas abuser de votre gentillesse mais j'ai encore une évolution à faire sur mon script.

Je voudrais faire à partir d'un fichier de départ des tests pour ne récupérer que certaine ligne.

Mon fichier de départ (fichier CSV avec « ; » en séparateur)

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


Ce que je voudrais faire :
*Pour tout matricule qui apparaît deux fois comparer le dernier champ :
-Si les deux champ de chaque ligne sont égales à F => je ne les veux pas
-Si les deux champs de chaque ligne sont égales à L => je veux prendre la deuxième ligne
-Si les deux champs de chaque ligne sont différents => je veux prendre la deuxième ligne
*Pour tout matricule qui n'apparaît qu'une fois je veux garder la ligne que si le dernier champ est égale à L.
Le fichier final doit ressembler à ça :

Matricule;nom;prenom;ville;date;témoin;
A1234;Dupont;Pierre;Paris;01/11/2010;F
C4321;Durant;Paul;Paris;12/10/2010;L
D9876;Randu;Eric;Marseille;26/02/2010;L

Donc voila ce qui me tracasse depuis une semaine !!
Si quelqu'un peut m'aider je lui serais très reconnaissant.
A voir également:

8 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
3 nov. 2010 à 13:30
Salut,

Essaye ça :

$ cat plop                                      
Matricule;nom;prenom;ville;date;témoin;                            
A1234;Dupont;Pierre;Paris;01/11/2010;L                             
A1234;Dupont;Pierre;Paris;01/11/2010;F                             
B5678;Pondu;jean;Paris;01/11/2010;F                                
C4321;Durant;Paul;Lyon;12/10/2010;L                                
C4321;Durant;Paul;Paris;12/10/2010;L                               
D9876;Randu;Eric;Marseille;26/02/2010;L                            
E6541;Jardin;Léa;Toulouse;16/08/2010;F                             
E6541;Jardin;Léa;Nice;16/08/2010;F    
                             
$ cat fich.sed                                  
#n                                                                 
/^Matricule/ p                                                     
N                                                                  
# Matricule unique                                                 
/\([^;]*;\).*\n\1.*/! {                                            
# Dernier champ = L                                                
/L\n/ {
P
D
}
D
}
# Dernier champs de chaque ligne = F
/\([^;]*;\).*;\(F\)\n\1.*;\2/ {
d
}
# Dernier champs de chaque ligne = L
/\([^;]*;\).*;\(L\)\n\1.*;\2/ {
s/.*\n//
p
}
# Dernier champs de chaque ligne différent
/\([^;]*;\).*;L\n\1.*;F\|\([^;]*;\).*;F\n\1.*;L/ {
s/.*\n//
p
}

$ sed -f fich.sed plop
Matricule;nom;prenom;ville;date;témoin;
A1234;Dupont;Pierre;Paris;01/11/2010;F
C4321;Durant;Paul;Paris;12/10/2010;L
D9876;Randu;Eric;Marseille;26/02/2010;L

$

;-))
0
Merci Jipicy,

Toujours aussi rapide et éfficace mais moi toujours aussi nul... :o))
J'ai pas tous compris à ta réponse et je n'arrive pas à le mettre en oeuvre.
Le plus simple pour que tu comprennes bien mon problème à te lire, voici comment j'ai compris ta réponse :

FICENT=$SIGACS/file/Fic_entrée.csv
FICSORT=$SIGACS/file/Fic_sed.csv

> $FICSORT
cat $FICENT
cat $FICSORT /^Matricule/p /\([^;]*;\).*\n\1.*/! {/L\n/ {PD}D}
/\([^;]*;\).*;\(F\)\n\1.*;\2/ {d}
/\([^;]*;\).*;\(L\)\n\1.*;\2/ {s/.*\n//p}
/\([^;]*;\).*;L\n\1.*;F\|\([^;]*;\).*;F\n\1.*;L/ {s/.*\n//p}

sed -f $FICSORT $FICENT

Merci pour ton aide.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
3 nov. 2010 à 19:23
Recopie mon fichier (fich.sed) tel quel et fait le test avec... les retours à la lignes sont importants et le "#n" en début encore plus (il est absent de ton fichier $FICSORT) , c'est l'équivalent de la syntaxe "-n" en ligne de commande pour un affichage conjointement avec le flag "p" ;-\
0
Bonjour Jipicy,

J'avouerai que je n'ai pas tout saisis sur la syntaxe...
j'ai quand même fait comme tu me la dis et c 'est vrai que j'ai moins de message d'erreur.
malgré tous je n'arrive pas à le faire fonctionner car je n'ai comme résultat que l'entête du fichier:
Matricule;nom;prenom;ville;date;témoin;

qu'est-ce que j'ai fait de mal ??
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
4 nov. 2010 à 18:10
Tu travailles sur quel système ?
Quelle distrib ?

Peux-tu mettre un exemple de ton fichier sur Ci-joint ?
Afin que je puisses tester en situation... ;-\
0
je t'ai mis sur le ci-joint:
-Fic.sed
-script_annu_filliale_NSO.ksh
-test_filiale.csv

après pour ta question système et distrib, ce que je peux te dire c'est que je passe par Putty et filzilla.

ça c'est le noyau linux
2.6.9-55.0.12.ELsmp

si sais pas si ça va t'aider ??
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
4 nov. 2010 à 18:27
Euh... et le lien vers ci-joint, il est où ??? ;-((
0

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

Posez votre question
Euh...oui désolé j'ai oublié...je n'avais pas compris comment ça marchait...
le voici http://www.cijoint.fr/cjlink.php?file=cj201011/cij7VsrP9J.zip
j'ai tous mis dans le zip.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
5 nov. 2010 à 11:08
Voilà pourquoi ça ne marche pas ;-((

$ cat -A test_filiale.csv
Matricule;nom;prenom;ville;date;tM-imoin                            ^M$
A1234;Dupont;Pierre;Paris;01/11/2010;L                             ^M$
A1234;Dupont;Pierre;Paris;01/11/2010;F                             ^M$
B5678;Pondu;jean;Paris;01/11/2010;F                                ^M$
C4321;Durant;Paul;Lyon;12/10/2010;L                                ^M$
C4321;Durant;Paul;Paris;12/10/2010;L                               ^M$
D9876;Randu;Eric;Marseille;26/02/2010;L                            ^M$
E6541;Jardin;LM-ia;Toulouse;16/08/2010;F                             ^M$
E6541;Jardin;LM-ia;Nice;16/08/2010;F    ^M$
Les fins de ligne sont celles de Micro$oft, sans compter les innombrables espaces avant ;-((

Donc il faut d'abord convertir ton fichier au système Unux :

dos2unix test_filiale.csv

Puis éliminer les espaces en fin de ligne :

sed -i.bak 's/\s\+$//' test_filiale.csv

Après ça, tout baigne :

$ sed -f Fic.sed test_filiale.csv
Matricule;nom;prenom;ville;date;t?moin
A1234;Dupont;Pierre;Paris;01/11/2010;F
C4321;Durant;Paul;Paris;12/10/2010;L
D9876;Randu;Eric;Marseille;26/02/2010;L

;-))
0
T'es trop fort !!! ça marche nikel

Merci beaucoup.

Une dernier question :

le fichier test_filiale est généré dans mon script par une comparaison deux fichier.
est-ce que tu crois qu'il est possible d'intégrer directement dans mon script tous ce qui est fais dans ton fichier Fic.sed ou bien je susi obligé de passer un fichier extrérieur ?

Merci encore Jipicy.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
5 nov. 2010 à 12:35
Tu peux l'intégrer comme ça :

sed -n '
/^Matricule/ p                                                     
N                                                                  
# Matricule unique                                                 
/\([^;]*;\).*\n\1.*/! {                                            
# Dernier champ = L                                                
/L\n/ {
P
D
}
D
}
# Dernier champs de chaque ligne = F
/\([^;]*;\).*;\(F\)\n\1.*;\2/ {
d
}
# Dernier champs de chaque ligne = L
/\([^;]*;\).*;\(L\)\n\1.*;\2/ {
s/.*\n//
p
}
# Dernier champs de chaque ligne différent
/\([^;]*;\).*;L\n\1.*;F\|\([^;]*;\).*;F\n\1.*;L/ {
s/.*\n//
p
}
' "${FICENT}"
0
Jipicy,

je me suis rendu compte qu'il y avait un cas de test que je n'avais pas pris en compte dans mon fichier des different cas et pour lequel ça ne semble pas fonctionner.
il s'agit du cas suivant :

A1999;Dudu;Pierre;Paris;01/11/2010;F
A1999;Dudu;Pierre;Paris;01/11/2010;L

pourtant il me semble que c'est codé dans "dernier champs de chaque ligne différent ou je me trompe ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
5 nov. 2010 à 17:53
Normalement oui, mais va savoir s'il n'y a pas un autre caractères exotique dans ton fichier ;-((

Si tu peux envoies-moi le fichier csv dans sa totalité que j'y jette un eoil...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
Modifié par jipicy le 5/11/2010 à 22:44
Bon apparemment il semblerait que le "OU" sur le test des derniers champs de chaque ligne différents ne soit pas pris en compte ;-((

Donc j'ai fais 2 tests distincts et là il semblerait que ça marche...

#n                                                                  
/^Matricule/ p                                                      
N                                                                   
# Matricule unique                                                  
/\([^;]*;\).*\n\1.*/! {                                             
# Dernier champ = L                                                 
/L\n/ { 
P 
D 
} 
D 
} 
# Dernier champs de chaque ligne = F 
/\([^;]*;\).*;\(F\)\n\1.*;\2/ { 
d 
} 
# Dernier champs de chaque ligne = L 
/\([^;]*;\).*;\(L\)\n\1.*;\2/ { 
s/.*\n// 
p 
} 
# Dernier champs de chaque ligne différent 
/\([^;]*;\).*;L\n\1.*;F/ { 
s/.*\n// 
p 
} 
/\([^;]*;\).*;F\n\1.*;L/ { 
s/.*\n// 
p 
}
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
5 nov. 2010 à 22:55
Ben en fait il suffit d'écrire la fin comme suit :

# Dernier champs de chaque ligne différent
/\([^;]*;\).*;L\n\1.*;F\|\([^;]*;\).*;F\n\2.*;L/ {
s/.*\n//
p
}
0
Salut Jipicy,

je sais pas si tu verras ce message mais j'ai un soucis.
A partir de ta solution, j'ai fais ceux-ci pour un fichier avec une seul ligne par matricule ceux-ci :

FICTemp11 :

Matricule;nom;prenom;ville;date;temoin
A1234;Dupont;Pierre;Paris;01/11/2010;F
C4321;Durant;Paul;Paris;12/10/2010;L
D9876;Randu;Eric;Marseille;26/02/2010;L


sed -n '
/^Matricule/ p
N
# Matricule unique
/\([^;]*;\).*\n\1.*/! {
# Dernier champ = L
/L\n/ {
P
D
}
D
}
' "${FICTemp11}" > $FICTemp12

Quelque soit le temoin L ou F de la dernière ligne celle-ci est supprimer.
tu serais pourquoi ??

Merci d'avance (si tu as le messae bien sur ;oP)
0
Salut Jipicy,

C'est super, ça marche nikel !!
un grand merci à toi encore une fois !!
maintenant que j'ai la solution, je vais prendre le temps de comprendre comment tu as procédé.

Merci !!
0
Salut Jipicy,

je sais pas si tu verras ce message mais j'ai un soucis.
A partir de ta solution, j'ai fais ceux-ci pour un fichier avec une seul ligne par matricule ceux-ci :

FICTemp11 :

Matricule;nom;prenom;ville;date;temoin
A1234;Dupont;Pierre;Paris;01/11/2010;F
C4321;Durant;Paul;Paris;12/10/2010;L
D9876;Randu;Eric;Marseille;26/02/2010;L


sed -n '
/^Matricule/ p
N
# Matricule unique
/\([^;]*;\).*\n\1.*/! {
# Dernier champ = L
/L\n/ {
P
D
}
D
}
' "${FICTemp11}" > $FICTemp12

Quelque soit le temoin L ou F de la dernière ligne celle-ci est supprimer.
tu serais pourquoi ??

Merci d'avance (si tu as le messae bien sur ;oP)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
29 nov. 2010 à 12:15
Salut,

Essaie comme ça :

sed -n '
# Dernière ligne se finit par "L" : Impression
${/L$/p}
N
/^Matricule/{P
D
b
}
# Matricule unique
/\([^;]*;\).*\n\1.*/! {
# Dernier champ = L
/L\n/ {
P
D
}
D
}'

En fait la dernière ligne n'était jamais lue. Enfin si, mais comme rien n'est ajouté à la suite, le test de matricule unique étant faux, la ligne était omise ;-\
0
Super !!!

ca marche nikel !!

Un grand merci à toi !!
0