Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 23/12/2009, à 11:54

gatchan

(résolu) Ajouter une ligne a interval régulier

bonjour à tous,

  J'ai un petit problème bash que je n'arrive pas à résoudre.
  Soit: Un fichier contenant n lignes. J'aimerait ajouter une ligne toutes les x lignes.

  Exemple:

INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
...
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);

Devrait donner:

INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
COMMIT;
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
COMMIT;
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
...
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
INSERT INTO AA VALUES(1,2,3);
COMMIT;

Auriez-vous ca sous la main?
Je pense que sed doit être une bonne voie de réponse, malheureusement, je n'ai pas encore trouvé ce cas de figure sur le net hmm

Merci d'avance!!

Dernière modification par gatchan (Le 23/12/2009, à 13:53)

Hors ligne

#2 Le 23/12/2009, à 12:06

sputnick

Re : (résolu) Ajouter une ligne a interval régulier

c=1; while read a; do ((c==4)) && { echo "newline foobarbaz"; c=0;} || echo "$a";  ((c++)); done < /chemin/vers/fichier

bashfr.org(random);
<arciks1994> dou tu connai qel age j'ai ?

Hors ligne

#3 Le 23/12/2009, à 12:07

becket

Re : (résolu) Ajouter une ligne a interval régulier

awk ' {print $0 ; if ( NR%3 == 0  ) print "COMMIT;" }' fichier.txt

Hors ligne

#4 Le 23/12/2009, à 13:52

gatchan

Re : (résolu) Ajouter une ligne a interval régulier

Merci pour vos réponses rapide big_smile

Je pense que je devrait m'en sortir!

Hors ligne

#5 Le 23/12/2009, à 18:45

Totor

Re : (résolu) Ajouter une ligne a interval régulier

sputnick a écrit :
c=1; while read a; do ((c==4)) && { echo "newline foobarbaz"; c=0;} || echo "$a";  ((c++)); done < /chemin/vers/fichier

sauf erreur de ma part, il y a une erreur d'algo (tu perds 1 ligne sur 4 !) :

c=1; while read a; do ((c==4)) && { echo "newline foobarbaz"; c=0;}; echo "$a";  ((c++)); done < /chemin/vers/fichier

-- Lucid Lynx --

Hors ligne

#6 Le 23/12/2009, à 18:56

sputnick

Re : (résolu) Ajouter une ligne a interval régulier

Bien vu, j'ai fais ca vite fait wink


bashfr.org(random);
<arciks1994> dou tu connai qel age j'ai ?

Hors ligne

#7 Le 23/12/2009, à 19:40

Totor

Re : (résolu) Ajouter une ligne a interval régulier

je propose une solution sed (que je n'ai pas testé car je ne l'ai pas sous la main) :

sed ':boucle; N; s/.*\n.*\n.*/&\nCOMMIT;/; T boucle' fichier

A noter que cette solution a le même inconvénient que les 2 autres :
si nb ligne % 3 <> 0, il manquera un commit ...

Cette contrainte est plus facile à corriger avec awk ou bash qu'avec sed et je ne préfère pas m'aventurer à la fournir sans avoir testé.


-- Lucid Lynx --

Hors ligne

#8 Le 23/12/2009, à 19:58

becket

Re : (résolu) Ajouter une ligne a interval régulier

Trois fois rien ....

 awk ' {print $0 ; if ( NR%3 == 0  ) print "COMMIT;" } END{ if ( NR%3 !=0)  print "COMMIT;" }'

Dernière modification par becket (Le 23/12/2009, à 21:18)

Hors ligne

#9 Le 23/12/2009, à 20:22

sputnick

Re : (résolu) Ajouter une ligne a interval régulier

J'avoue que ton awk est assez classe becket smile
Ca a été ma premiere idée de me servir du modulo en awk, mais ca me prenait moins de temps de pondre un truc en bash.


bashfr.org(random);
<arciks1994> dou tu connai qel age j'ai ?

Hors ligne

#10 Le 23/12/2009, à 23:47

Totor

Re : (résolu) Ajouter une ligne a interval régulier

Autre solution awk (plus compliquée):

awk --posix 'BEGIN { RS="";CO="\nCOMMIT;" } { gsub(/);([^\n]*\n){2}[^\n]*/,"&"CO); print $0, $0 !~ CO"$" ? CO : "" }' fichier

solution finale sed :

sed ":deb; $ b fin ; N; s/.*\n.*\n.*/&/; T deb;:fin; a\COMMIT\; " fichier

Dernière modification par Totor (Le 23/12/2009, à 23:54)


-- Lucid Lynx --

Hors ligne

#11 Le 24/12/2009, à 11:17

nesthib

Re : (résolu) Ajouter une ligne a interval régulier

une solution relativement simple avec l'éditeur de texte VI
ouvre ton fichier :

vi ton fichier

tape la commande suivante :

:%s/\v(.*\n){5}/&COMMIT;\r

si c'est bon, enregistre :

:x

edit : bien sûr remplace 5 par ton nombre de lignes wink

Dernière modification par nesthib (Le 24/12/2009, à 11:17)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdnGMT-4

En ligne

#12 Le 28/01/2010, à 21:59

hardball

Re : (résolu) Ajouter une ligne a interval régulier

hello

une petite soluce en perl :

 perl -pe '$.%5||print"COMMIT;\n"' fichier.sql

-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !

Hors ligne

Haut de page ↑