Rechercher : dans
Par :

SED ou AWK pour fichier requêtes multiples

Dernière réponse le 16 jun 2009 à 15:25:59 pcsystemd, le 16 jun 2009 à 09:41:18 
 Signaler ce message aux modérateurs

Bonjour,
j'ai le fichier suivant qui contient :

email                        
----------------------------------------------------
 33@mail.fr
 trmc@exemple.fr
etc..

et je souhaite savoir s'il est possible avec SED de le formater de la façon suivante et comment faire :
INSERT INTO mybd (act,mail) VALUES(1,'33@mail.fr');
INSERT INTO simplenews_snid_tid (snid,tid) VALUES(LAST_INSERT_ID(),507);
INSERT INTO simplenews_subscriptions (activated,mail) VALUES(1,'trmc@exemple.fr');
INSERT INTO simplenews_snid_tid (snid,tid) VALUES(LAST_INSERT_ID(),507);
etc..

ATTENTION : Dans le premier fichier il y a un espace en début de chaque ligne qu'il faut supprimé ainsi que
email
----------------------------------------------------
Merci

L'accès au savoir est la première liberté que chaque homme d­evrait avoir.
Configuration: Linux
Mozilla 1.9.0.7

Meilleures réponses pour « SED ou AWK pour fichier requêtes multiples » dans :
Sed - Supprimer une ou plusieurs lignes d'un fichier Voir Supprimer 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...
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 - Insérer des espacements VoirEspacement dans un fichier Ajouter une ligne blanche après chaque phrase (ponctuée par un retour chariot) : sed G fichier.txt Ajouter une ligne blanche après chaque phrase (ponctuée par un retour chariot), sans tenir compte des lignes blanches...
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"...
Ouverture d'un fichier VoirOuverture d'un fichier existant crée avec le même logiciel Il existe fondamentalement deux méthodes pour ouvrir un fichier sous Windows : Choisissez dans le menu du logiciel concerné Fichier > Ouvrir et naviguez jusqu’au fichier concerné dans la...

1

jipicy, le 16 jun 2009 à 11:21:36

Salut,

sed -n "/^ /{s/ \(.*\)/INSERT INTO mybd (act,mail) VALUES(1,'\1');\n\
INSERT INTO simplenews_snid_tid (snid,tid) VALUES(LAST_INSERT_ID(),507);\n\
INSERT INTO simplenews_subscriptions (activated,mail)/p}"
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

2

pcsystemd, le 16 jun 2009 à 12:28:43

Merci encore une fois. J''ai du mal a comprendre la synthaxe de SED pourtant c'est pas faute d'avoir lu ton tuto et d'autres mais j'ai toujours du mal a me souvenir de tous les paramètres ainsi que des diffèrences lorsque tu lance SED en ligne de commande ou depuis un script.

Dans la commande que tu m'indiques quels sont les paramètres que tu utilises pour supprimer les espaces devant chaque ligne ainsi que
email
----------------------------------------------------

Et si je n'avais pas d'espaces a supprimer ni
email
----------------------------------------------------

qu'elle serait la commande SED?

Merci mille fois

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

Répondre à pcsystemd

3

jipicy, le 16 jun 2009 à 12:52:31

Dans la commande que tu m'indiques quels sont les paramètres que tu utilises pour supprimer les espaces devant chaque ligne
En fait j'utilise les sous-expressions et références arrières.
Ta ligne commence par un espace et nous voulons récupérer ce qui se trouve derrière. Donc dans la commande de substitution (côté gauche) mon motif ressemble à :

/ \(.*\)/
Un espace après le caractère délimiteur (/) et la sous-expression qui renferme le reste de la ligne (.*). C'est cette sous-expression qui sera appelée dans la partie droite de remplacement en y faisant référence par le numéro correspondant à sa place (ici il n'y en a qu'une, donc c'est la référence "\1")


ainsi que
email
----------------------------------------------------

Tu as du remarqué l'option "-n" en début de syntaxe (sed -n), la condition "/^ /" (ne matcher que les lignes commençant par un espace) et le flag "p" en fin de syntaxe, ce qui implique que seules les lignes correspondant au motif (commençant par un espace) seront envoyées sur la sortie standard.

Et si je n'avais pas d'espaces a supprimer ni
email
----------------------------------------------------

qu'elle serait la commande SED?

On retire l'option "-n" et le flag "p", puis plus besoin de sous-expression ni de référence arrière, juste l'emploi du méta-caractère & à la place :

sed -n "/^ /{s/.*/blablabla'&');blablabla/"

$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

4

pcsystemd, le 16 jun 2009 à 13:36:59

Donc si je te suis bien ça c'est moins sûr, j'ai fait :

 sed -n "/^ /{s/.*/INSERT INTO matable1  (acti,mail) VALUES(1,'&');\n\ INSERT INTO matable2 (uid,tid) VALUES(LAST_INSERT_ID(),507);/}" test.sql > test2.sql

le souci c'est que le fichier test2.sql est vide!!
Merci
L'accès au savoir est la première liberté que chaque homme devrait avoir.

Répondre à pcsystemd

5

jipicy, le 16 jun 2009 à 14:25:08

Tu as oublié d'enlever l'option "-n" :

-n, --quiet, --silent

* Demande implicite de ne pas afficher l'état de la mémoire principale (mémoire tampon). À l'intérieur d'un script, la notation se fera de cette façon "#n" (un signe dièse suivi du caractère "n") et devra se trouver sur la 1ère ligne du script.

En deux mots, cette option empêche l'affichage sur la sortie standard. Elle doit être employée conjointement avec le flag "p".
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

6

pcsystemd, le 16 jun 2009 à 14:49:01

Bin écoute je dois vraiement être nul car si je saisis :

sed "/^ /{s/.*/INSERT INTO matable1  (acti,mail) VALUES(1,'&');\n\ INSERT INTO matable2 (uid,tid) VALUES(LAST_INSERT_ID(),507);/}" test.sql > test2.sql


rien ne se passe le fichier test2.sql est identique au fichier test.sql

Je m'arrache les cheveux!! L'accès au savoir est la première liberté que chaque homme devrait avoir.

Répondre à pcsystemd

7

jipicy, le 16 jun 2009 à 15:09:49

Ben chez moi ça marche ;-\

jp@MDK:~/tmpfs ssh$ cat plop
email
----------------------------------------------------
 33@mail.fr
 trmc@exemple.fr
etc..

jp@MDK:~/tmpfs ssh$  sed "/^ /{s/.*/INSERT INTO matable1  (acti,mail) VALUES(1,'&');\n\
INSERT INTO matable2 (uid,tid) VALUES(LAST_INSERT_ID(),507);/}\
" plop > toto

jp@MDK:~/tmpfs ssh$ cat toto
email
----------------------------------------------------
INSERT INTO matable1  (acti,mail) VALUES(1,' 33@mail.fr');
INSERT INTO matable2 (uid,tid) VALUES(LAST_INSERT_ID(),507);
INSERT INTO matable1  (acti,mail) VALUES(1,' trmc@exemple.fr');
INSERT INTO matable2 (uid,tid) VALUES(LAST_INSERT_ID(),507);
etc..

jp@MDK:~/tmpfs ssh$
;-\ ? $ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

8

 pcsystemd, le 16 jun 2009 à 15:25:59

Bon c'est ok. En faites il n'y a plus d'espaces devant chaque ligne dans mon fichier c'est pourquoi la ligne de commande ne fonctionnait pas chez moi. Je l'ai modifié comme suit en enlevant l'espace entre le ^/ et c'est ok

sed "/^/{s/.*/INSERT INTO matable1  (acti,mail) VALUES(1,'&');\n\
INSERT INTO matable2 (uid,tid) VALUES(LAST_INSERT_ID(),507);/}\
" plop > toto


Merci encore jipicy pour le temps que tu m'as accordé. L'accès au savoir est la première liberté que chaque homme devrait avoir.

Répondre à pcsystemd
Collection CommentÇaMarche.net