Traitement d'un fichier avec SED ou AWK
Résolu
pcsystemd
Messages postés
702
Date d'inscription
Statut
Membre
Dernière intervention
-
pcsystemd Messages postés 702 Date d'inscription Statut Membre Dernière intervention -
pcsystemd Messages postés 702 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je reviens vers vous de nouveau car j'ai encore un casse tête pour moi.
Je dois traiter un fichier contenant des milliers de lignes comme ci-dessous:
33@liv.fr|-1
007@froru.fr|0
00844.nen@mail.fr|0
mh@mail.fr|0
8675@mail.fr|-1
140279@rut.fr|-1
77310@mail.fr|0
0022@mail.fr|0
toto98@mail.fr|0
02vale@mail.com|-1
ilan@mail.fr|0
de maniere a pouvoir dans un script shell avoir :
-Pour les lignes avec -1
Avec SED :
-Pour les lignes avec 0
et cela si possible dans la meme commande SED du style :
Merci pour toute l'aide que vous pourrez m'apporter.
je reviens vers vous de nouveau car j'ai encore un casse tête pour moi.
Je dois traiter un fichier contenant des milliers de lignes comme ci-dessous:
33@liv.fr|-1
007@froru.fr|0
00844.nen@mail.fr|0
mh@mail.fr|0
8675@mail.fr|-1
140279@rut.fr|-1
77310@mail.fr|0
0022@mail.fr|0
toto98@mail.fr|0
02vale@mail.com|-1
ilan@mail.fr|0
de maniere a pouvoir dans un script shell avoir :
-Pour les lignes avec -1
Avec SED :
sed " s/.*/DELETE FROM simple where mail="33@liv.fr";DELETE FROM simple_id where id="";/" ${OUTFIL} > ${INSERTFILE}
-Pour les lignes avec 0
sed " s/.*/INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'&');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507);/" ${OUTFIL} > ${INSERTFILE}
et cela si possible dans la meme commande SED du style :
sed " s/.*/DELETE FROM simple where mail="33@liv.fr";DELETE FROM simple_id where id="";INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'&');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507);/" ${OUTFIL} > ${INSERTFILE}
Merci pour toute l'aide que vous pourrez m'apporter.
A voir également:
- Traitement d'un fichier avec SED ou AWK
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
10 réponses
Salut,
sed " /-1$/ { s/.*/DELETE FROM simple where mail="33@liv.fr";DELETE FROM simple_id where id=\"\";/ } /0$/ { s/.*/INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'&');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507);/ } " ${OUTFIL} > ${INSERTFILE};-))
hello
avec awk
avec awk
$ cat f1.awk $2 == -1 {printf("DELETE FROM simple where mail=\"33@liv.fr\";DELETE FROM simple_id where id=\"\";\n")} $2 == 0 {printf("INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,\x27%s\x27);INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507);\n", $1)} $ awk -F'|' -f f1.awk < data DELETE FROM simple where mail="33@liv.fr";DELETE FROM simple_id where id=""; INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'007@froru.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'00844.nen@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'mh@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); DELETE FROM simple where mail="33@liv.fr";DELETE FROM simple_id where id=""; DELETE FROM simple where mail="33@liv.fr";DELETE FROM simple_id where id=""; INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'77310@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'0022@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'toto98@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); DELETE FROM simple where mail="33@liv.fr";DELETE FROM simple_id where id=""; INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'ilan@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507);
Oui je ne l'oublie t'inquiète, merci dubcek également.
il y a juste un truc c'est que dans les lignes DELETE le where doit etre dynamique par rapport au fichier fourni et pas toujours le meme "33@liv.fr" comme dans VALUES (1,'&') dont le & a une valeur dynamique apr rapport au fichier de données.
Merci
il y a juste un truc c'est que dans les lignes DELETE le where doit etre dynamique par rapport au fichier fourni et pas toujours le meme "33@liv.fr" comme dans VALUES (1,'&') dont le & a une valeur dynamique apr rapport au fichier de données.
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
il me semblait aussi
remplacer cette ligne
$2 == -1 {printf("DELETE FROM simple where mail=\"%s\";DELETE FROM simple_id where id=\"\";\n", $1)}
remplacer cette ligne
$2 == -1 {printf("DELETE FROM simple where mail=\"%s\";DELETE FROM simple_id where id=\"\";\n", $1)}
sed " /-1$/ { s/\(.*\)|-1/DELETE FROM simple where mail=\"\1\";DELETE FROM simple_id where id=\"\";/ } /0$/ { s/\(.*\)|0/INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'\1');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507);/ } "
Bon voila j'ai testé avec les deux façons SED et AWK .
Avec SED : Cela fonctionne sauf qu'il ne prends pas en comptepas la dernière occurrence de mon fichier.
SED traite les lignes suivantes :
33@liv.fr|-1
007@froru.fr|0
00844.nen@mail.fr|0
mh@mail.fr|0
8675@mail.fr|-1
140279@rut.fr|-1
77310@mail.fr|0
0022@mail.fr|0
toto98@mail.fr|0
02vale@mail.com|-1
Mais pas la derniére de mon fichier et même si j'en rajoute il ne traite jamais la derniere?
ilan@mail.fr|0
Une idée?
Avec AWK : Depuis un script shell je 'narrive pas a le faire fonctionner a mon avis il me manque des quotes ou autres mais ou car quand je le lance mon script shell en DEBUG voici l'erreur :
Une idée?
Autre question :
Ce n'est pas pour opposé SED ou AWK loin de moi c'est juste que je me demande au niveau de l'optimisation et des performances dans un script laquelle entre SED ou AWK est la moins gourmande en ressources .
Merci
Avec SED : Cela fonctionne sauf qu'il ne prends pas en comptepas la dernière occurrence de mon fichier.
SED traite les lignes suivantes :
33@liv.fr|-1
007@froru.fr|0
00844.nen@mail.fr|0
mh@mail.fr|0
8675@mail.fr|-1
140279@rut.fr|-1
77310@mail.fr|0
0022@mail.fr|0
toto98@mail.fr|0
02vale@mail.com|-1
Mais pas la derniére de mon fichier et même si j'en rajoute il ne traite jamais la derniere?
ilan@mail.fr|0
Une idée?
Avec AWK : Depuis un script shell je 'narrive pas a le faire fonctionner a mon avis il me manque des quotes ou autres mais ou car quand je le lance mon script shell en DEBUG voici l'erreur :
/testzip.sh: line 26: syntax error near unexpected token `(' ./testzip.sh: line 26: `$2 == -1 {printf("DELETE FROM simple where mail=\"%s\";DELETE FROM simple_id where id=\"\";\n", $1)} '
Une idée?
Autre question :
Ce n'est pas pour opposé SED ou AWK loin de moi c'est juste que je me demande au niveau de l'optimisation et des performances dans un script laquelle entre SED ou AWK est la moins gourmande en ressources .
Merci
je pense que sed et awk sont aussi peu gourmands et performants l'un que l'autre
$ cat x #!/bin/bash awk -F'|' '$2 == -1 {printf("DELETE FROM simple where mail=\"%s\";DELETE FROM simple_id where id=\"\";\n", $1)} ; $2 == 0 {printf("INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,\x27%s\x27);INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507);\n", $1)}' < data $ $ ./x DELETE FROM simple where mail="33@liv.fr";DELETE FROM simple_id where id=""; INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'007@froru.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'00844.nen@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'mh@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); DELETE FROM simple where mail="8675@mail.fr";DELETE FROM simple_id where id=""; DELETE FROM simple where mail="140279@rut.fr";DELETE FROM simple_id where id=""; INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'77310@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'0022@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'toto98@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507); DELETE FROM simple where mail="02vale@mail.com";DELETE FROM simple_id where id=""; INSERT IGNORE INTO simple_su (acti,mail) VALUES (1,'ilan@mail.fr');INSERT INTO simple_tid (sid,tid) VALUES(LAST_INSERT_ID(),507);