Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/08/2011, 11h36   #1
Membre du Club
 
Inscription : novembre 2006
Messages : 233
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 233
Points : 45
Points : 45
Par défaut recopie de ligne à x endroits dans le fichier

Bonjour
j'ai un fichier
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE2XXXX
CODE2XXXX
CODE3XXX
CODE3
CODE4
CODE1XXXXdfgfg
CODE2XXXX
CODE3XXX
CODE3
CODE1XXXXdfgfg
CODE2XXXX
CODE3
et je voudrais en sortie avoir
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE2XXXX
CODE2XXXX
CODE3XXX
CODE3
CODE4
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE3XXX
CODE3
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE3
OU MA_LIGNE_ENTETE est dupliquée avant CHAQUE ligne CODE1

je pense qu'il faut utiliser sed 1 h ENTREE.TXT > SORTIE.TXT
Mais je n'arrive pas à trouver la partie recopie avant CODE1

Merci
altair8080 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/08/2011, 11h56   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 538
Points : 7 754
Points : 7 754
tu peux utiliser sed avec insert puisque ton marqueur d'emplacement est toujours le même.

Code :
1
2
3
sed '/CODE1.*/i\
MA_LIGNE_ENTETE
1d' t
puis de supprimer le doublon généré à la ligne 1 puisque la ligne 2 est code1....
en clair ça cherche CODE1 suivi de n'importe quoi et insère avant ta ligne d'entête.


exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[fpu@lne ~/tmp] sed '/CODE1.*/i\
MA_LIGNE_ENTETE
1d' t
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE2XXXX
CODE2XXXX
CODE3XXX
CODE3
CODE4
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE3XXX
CODE3
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE3
[fpu@lne ~/tmp]
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 12h24   #3
Membre du Club
 
Inscription : novembre 2006
Messages : 233
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 233
Points : 45
Points : 45
Merci de ta réponse rapide par contre au niveau MA_LIGNE_ENTETE
est suivi de données variable. la ligne n'est pas une constante.
Elle commence par la constante suivi d'une zone variable

comment procédé ainsi

merci
altair8080 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/08/2011, 14h56   #4
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 538
Points : 7 754
Points : 7 754
si dans MA_LIGNE_ENTETE tu as juste LIGNE comme constante :


Code :
 sed '/.*LIGNE.*/h ; /CODE1.*/G'
place ta ligne contenant LIGNE apres chaque occurrence CODE1 .*
je te laisse chercher pour la mise en plage inverse avec la ligne avant

attention entre 'G' et 'g'

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[fpu@lne /tmp] sed '/.*LIGNE.*/h ; /CODE1.*/G' t
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
MA_LIGNE_ENTETE
CODE2XXXX
CODE2XXXX
CODE2XXXX
CODE3XXX
CODE3
CODE4
CODE1XXXXdfgfg
MA_LIGNE_ENTETE
CODE2XXXX
CODE3XXX
CODE3
CODE1XXXXdfgfg
MA_LIGNE_ENTETE
CODE2XXXX
CODE3
[fpu@lne /tmp]
conclusion pour éliminer le décalage tu crées une ligne vide au dessus des CODE1.* et tu paste :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[fpu@lne /tmp] sed '/.*LIGNE.*/h ; /CODE1.*/{x;p;x;};1d' t
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE2XXXX
CODE2XXXX
CODE3XXX
CODE3
CODE4
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE3XXX
CODE3
MA_LIGNE_ENTETE
CODE1XXXXdfgfg
CODE2XXXX
CODE3
[fpu@lne /tmp]
bien sur ce faisant si on change la ligne de référence ça marche tjrs :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[fpu@lne /tmp] sed '/.*LIGNE.*/h ; /CODE1.*/{x;p;x;};1d' t
MA_LIGNE_ENTETEdfgdshfgsdhf
CODE1XXXXdfgfg
CODE2XXXX
CODE2XXXX
CODE2XXXX
CODE3XXX
CODE3
CODE4
MA_LIGNE_ENTETEdfgdshfgsdhf
CODE1XXXXdfgfg
CODE2XXXX
CODE3XXX
CODE3
MA_LIGNE_ENTETEdfgdshfgsdhf
CODE1XXXXdfgfg
CODE2XXXX
CODE3
[fpu@lne /tmp]
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 16h37   #5
Membre du Club
 
Inscription : novembre 2006
Messages : 233
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 233
Points : 45
Points : 45
Merci c'est nickel,
altair8080 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h37.


 
 
 
 
Partenaires

Hébergement Web