#1 Le 23/12/2009, à 10: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 ![]()
Merci d'avance!!
Dernière modification par gatchan (Le 23/12/2009, à 12:53)
Hors ligne
#2 Le 23/12/2009, à 11: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/fichierHors ligne
#3 Le 23/12/2009, à 11:07
- becket

Re : (résolu) Ajouter une ligne a interval régulier
awk ' {print $0 ; if ( NR%3 == 0 ) print "COMMIT;" }' fichier.txtHors ligne
#4 Le 23/12/2009, à 12:52
- gatchan

Re : (résolu) Ajouter une ligne a interval régulier
Merci pour vos réponses rapide ![]()
Je pense que je devrait m'en sortir!
Hors ligne
#5 Le 23/12/2009, à 17:45
- Totor

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
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, à 17:56
- sputnick

Re : (résolu) Ajouter une ligne a interval régulier
Bien vu, j'ai fais ca vite fait ![]()
Hors ligne
#7 Le 23/12/2009, à 18: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' fichierA 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, à 18: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, à 20:18)
Hors ligne
#9 Le 23/12/2009, à 19:22
- sputnick

Re : (résolu) Ajouter une ligne a interval régulier
J'avoue que ton awk est assez classe becket ![]()
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.
Hors ligne
#10 Le 23/12/2009, à 22: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 : "" }' fichiersolution finale sed :
sed ":deb; $ b fin ; N; s/.*\n.*\n.*/&/; T deb;:fin; a\COMMIT\; " fichierDernière modification par Totor (Le 23/12/2009, à 22:54)
-- Lucid Lynx --
Hors ligne
#11 Le 24/12/2009, à 10: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 fichiertape la commande suivante :
:%s/\v(.*\n){5}/&COMMIT;\rsi c'est bon, enregistre :
:xedit : bien sûr remplace 5 par ton nombre de lignes ![]()
Dernière modification par nesthib (Le 24/12/2009, à 10:17)
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#12 Le 28/01/2010, à 20: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