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 02/08/2007, 11h49   #1
Invité de passage
 
Inscription : août 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 3
Points : 1
Points : 1
Par défaut [sed][awk] Rajout sur lignes details le titre du paragraphe

Bonjour,

J'ai un fichier texte composé de la manière suivante :

[1] Devise1
[D] col1 col2 col3 col4
[D] col1 col2 col3 col4

[1] Devise2
[D] col2 col2 col3 col4
[D] col2 col2 col3 col4


J'aimerais obtenir le fichier suivant :

[D] col1 col2 col3 col4 Devise1
[D] col1 col2 col3 col4 Devise1
[D] col2 col2 col3 col4 Devise2
[D] col2 col2 col3 col4 Devise2

J'arrive à le faire par un cat du fichier et un test sequentiel des 3 premiers caractères de chaque ligne ([1] ou [D]).
(si [1] je gére une variable $Devise, si [D] je réécris la ligne dans un fichier en y rajoutant $Devise ).
Mais le pb est que mon fichier est énorme 150 Mb et cette méthode est trop coûteuse en temps.

Une idée plus rapide avec sed ou awk ou combinaison de grep,sed, awk ???
J'avoue avoir cherché et ne pas avoir trouvé.

Merci d'avance pour votre aide !
Mimi
mimi57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2007, 12h32   #2
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Solution en awk

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
awk '
{
	if ($1=="[1]") 
	{
		devise=$2 
	       	next
	}
	if ($1=="[D]")
	{
		print $0, devise 
	       	next
	}
} ' liste.txt
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2007, 12h37   #3
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 945
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 945
Points : 1 083
Points : 1 083
En Sed, il suffit de faire ça (en passant l'option -n) :
Code :
1
2
/^\[1\]/{s/^...//;h;d;}
/^\[D\]/{G;s/\n//p;}
Je ne vois pas bien comment on pourrait optimiser (ou alors, en le faisant à la main, en C/C++...).
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/08/2007, 11h53   #4
Invité de passage
 
Inscription : août 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 3
Points : 1
Points : 1
LLB et BlaireauOne, merci beaucoup pour vos réponses.
J'essaie et je vous tiens au courant.

Cdt
Mimi
mimi57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2007, 10h55   #5
Invité de passage
 
Inscription : août 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 3
Points : 1
Points : 1
J'ai opté pour la solution sed -n, qui est plus rapide et qui fonctionne à merveille.
Merci beaucoup !

Mimi57
mimi57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h15.


 
 
 
 
Partenaires

Hébergement Web