Unix -débutant-supprésion ligne dans fichier [Résolu/Fermé]

Signaler
-
 JsuisNul -
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.

8 réponses

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
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

$

;-))
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.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
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" ;-\
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 ??
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
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... ;-\
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 ??
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
Euh... et le lien vers ci-joint, il est où ??? ;-((
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.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
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

;-))
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.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
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}"
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 ?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
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...
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
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 
}
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 742
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
}
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)
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 !!
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)
Messages postés
35016
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
6 juillet 2020
5 251
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 ;-\
Super !!!

ca marche nikel !!

Un grand merci à toi !!