Unix -débutant-supprésion ligne dans fichier
Résolu
JsuisNul
-
JsuisNul -
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.
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:
- Unix -débutant-supprésion ligne dans fichier
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
8 réponses
Salut,
Essaye ça :
;-))
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.
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.
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 ??
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 ??
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... ;-\
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 ??
-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 ??
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.
le voici http://www.cijoint.fr/cjlink.php?file=cj201011/cij7VsrP9J.zip
j'ai tous mis dans le zip.
Voilà pourquoi ça ne marche pas ;-((
Donc il faut d'abord convertir ton fichier au système Unux :
Puis éliminer les espaces en fin de ligne :
Après ça, tout baigne :
;-))
$ 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.
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.
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 ?
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 ?
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...
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 }
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)
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 !!
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)
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,
Essaie comme ça :
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 ;-\
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 ;-\