Unix -débutant-supprésion ligne dans fichier
Résolu/Fermé
A voir également:
- Unix -débutant-supprésion ligne dans fichier
- Fichier rar - Guide
- Fichier host - Guide
- Fichier iso - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir fichier .bin - Guide
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
3 nov. 2010 à 13:30
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.
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
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" ;-\
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 ??
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
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... ;-\
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 ??
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
4 nov. 2010 à 18:27
Euh... et le lien vers ci-joint, il est où ??? ;-((
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.
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
5 nov. 2010 à 11:08
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.
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
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}"
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 ?
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
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...
Si tu peux envoies-moi le fichier csv dans sa totalité que j'y jette un eoil...
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
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...
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 }
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
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 }
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)
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
29 nov. 2010 à 12:15
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 ;-\