Rechercher : dans
Par :

Traitement d'un fichier avec SED ou AWK

Dernière réponse le 10 jui 2009 à 16:21:22 pcsystemd, le 9 jui 2009 à 17:20:39 
 Signaler ce message aux modérateurs

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 :

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. L'accès au savoir est la première liberté que chaque homme devrait avoir.
Configuration: Linux
Mozilla 1.9.0.7

Meilleures réponses pour « Traitement d'un fichier avec SED ou AWK » dans :
Sed - Introduction à SED - Part III VoirSED - The Stream EDitor - Part III Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Transformer des colonnes en lignes dans un fichier VoirDifférents outils de Linux sont très doués pour travailler avec des lignes, mais pas avec des colonnes (c'est leur rôle) Sed, Awk, Grep, etc. Cependant, il peut arriver pour X raisons que vous ayez un fichier où les données sont à lire en...
Sed - Supprimer une ou plusieurs lignes d'un fichier VoirSupprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
Fichier RTF VoirFormat RTF Un fichier RTF est un fichier de traitement de texte au format standard Rich Text Format. L'intéret du format RTF est de pouvoir être lu par la quasi-totalité des applications de bureautique et sur tous les systèmes d'exploitation...
Fichier DOC VoirFormat DOC Un fichier DOC est un fichier de traitement de texte de la suite bureautique Microsoft Office. Comment lire un fichier DOC ? Il peut néanmoins être ouvert avec Word Viewer ou avec la suite gratuite et libre OpenOffice.org. OpenOffice...
Fichier RAW VoirFormat RAW Un fichier RAW est un fichier graphique. Le format RAW est considéré comme un format de qualité dans la mesure où les données sont stockées de manière brute, sans aucun traitement, ce qui permet aux photographes de pouvoir les retoucher...

1

jipicy, le 9 jui 2009 à 17:40:22

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}
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

2

dubcek, le 10 jui 2009 à 08:52:06

Hello
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);

Répondre à dubcek

3

pcsystemd, le 10 jui 2009 à 10:19:04

Merci beaucoup jipicy,

je test et je te dis ce qu'il en est L'accès au savoir est la première liberté que chaque homme d­evrait avoir.

Répondre à pcsystemd

4

jipicy, le 10 jui 2009 à 10:20:33

N'oublies pas dubcek au passage aussi ;-(
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

5

pcsystemd, le 10 jui 2009 à 10:26:24

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 L'accès au savoir est la première liberté que chaque homme devrait avoir.

Répondre à pcsystemd

6

dubcek, le 10 jui 2009 à 10:36:03

Il me semblait aussi
remplacer cette ligne
$2 == -1 {printf("DELETE FROM simple where mail=\"%s\";DELETE FROM simple_id where id=\"\";\n", $1)}

Répondre à dubcek

7

jipicy, le 10 jui 2009 à 10:40:55

 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);/
}
"
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

8

pcsystemd, le 10 jui 2009 à 12:09:53

Merci,

je test tout cela et je vous dit ce qu'il en est.

;-) L'accès au savoir est la première liberté que chaque homme d­evrait avoir.

Répondre à pcsystemd

9

pcsystemd, le 10 jui 2009 à 14:54:43

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 :

/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 L'accès au savoir est la première liberté que chaque homme devrait avoir.

Répondre à pcsystemd

11

jipicy, le 10 jui 2009 à 15:33:18

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

Vérifie qu'il n'y ait aucun caractère vide (espace) après le "0" sur la ligne...

cat -A ton_fichier
ou
sed -n l ton_fichier
;-)
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

10

dubcek, le 10 jui 2009 à 15:22:45

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);

Répondre à dubcek

12

 pcsystemd, le 10 jui 2009 à 16:21:22

-jipicy y avait bien un espace :
cat -A fichier
ipoan@mail.fr|0 $

Maintenant cela fonctionne

-dubcek cela fonctionne également parfaitement

Mille fois merci a tous les deux.

NS : J'ai un autre post en "base de données" pour une question au cas ou vous maitrisez aussi bien le SQL que SED et AWK ;-) L'accès au savoir est la première liberté que chaque homme devrait avoir.

Répondre à pcsystemd