#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/fichier
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors 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.txt
Hors 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
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
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' 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, à 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.
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
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 : "" }' 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, à 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 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
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