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 29/11/2007, 23h00   #1
Invité de passage
 
Inscription : novembre 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 11
Points : 1
Points : 1
Par défaut Problème avec awk

Bonjour,
voici mon souci
je souhaite transformer le fichier CRA ci-dessous en fichier csv resultat RES en utilisant la commande awk

CRA
id;code;date;attribut;valeur
1;23;1207;compte;val1
1;23;1207;telephone;t1
1;23;1207;adresse;test
2;25;1107;compte;val2
2;25;1107;telephone;t2
2;25;1107;adresse;titi

le but c'est de transformer certains champs de lignes de même id en colonne

RES
id;code;date;compte;telephone;adresse
1; 23 ;1207;val1 ;t1 ;test
2; 25 ;1107;val2 ;t2 ;titi

je cherche l'astuce mais je ne trouve pas, si vous pouvez, m'aider, ça m'aiderais beaucoup.
bstages2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2007, 09h14   #2
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Essaye ceci:

Code :
$awk -f cmdes-awk ton-fichier-a-modifier
cmdes-awk
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BEGIN {
    FS = ";"
    previous = ""
    new = ""
}
 
{
    if ( $1 $2 $3 == previous) {
        new = new ";" $5
    } else {
        if(new != "") print new
        previous = $1 $2 $3
        new = $1 ";" $2 ";" $3 ";" $5
    }
}
 
END {
        print  new
}
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2007, 11h11   #3
Invité de passage
 
Inscription : novembre 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 11
Points : 1
Points : 1
Par défaut awk

Bonjour,
Merci pour ton aide.
je viens d'exécuter le script que tu propose, ça à l'air de marcher.
il m'affiche ceci :

id; code ; date ; valeur
1; 23 ;1207 ; val1 ; t1 ; test
2; 25 ;1107 ; val2 ; t2 ; titi

je cherche encore à l'affiner pour avoir exactement ce que je souhaite (ci-dessous).

id;code ; date ; compte ; telephone ; adresse
1; 23 ; 1207 ; val1 ; t1 ; test
2; 25 ; 1107 ; val2 ; t2 ; titi
bstages2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2007, 12h41   #4
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Dans le bloc BEGIN, ajoute simplement:
Code :
print "id;code;date;compte;telephone;adresse"
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2007, 12h52   #5
Invité de passage
 
Inscription : novembre 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 11
Points : 1
Points : 1
Par défaut awk urgent svp

éffectivement ce serait plus simple pour moi mais je ne souhaite pas figer les colonne puisque ma table peut varier, je souhaite recuper les colonne par $x (x=1;...)
bstages2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2007, 22h01   #6
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
Procédure awk :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
awk '
BEGIN {
    FS = ";"
    FlagFirstKey=1
    PreviousKey = ""
    NewRecord = ""
}
 
{
    #-- Record Number 1, ecr. 1ere partie du titre
    if (NR == 1) {
	printf("%s;%s;%s",$1,$2,$3)
	next
    }
    if ( $1 $2 $3 == PreviousKey) {
    	if (FlagFirstKey == 1) {
    		#-- ecr. complement de titre (1ere clé traitée)
		printf(";%s",$4)
	}
        NewRecord = NewRecord ";" $5
	next
    }
    if (NewRecord != "") {
	if (FlagFirstKey == 1) {
		#-- fin de traitement de la 1ere clé 
		print ""
    		FlagFirstKey=0
	} 
	print NewRecord
    } else {
	#-- ecr. complement de titre (1ere clé traitée)
	printf(";%s",$4)
    }
    PreviousKey = $1 $2 $3
    NewRecord = $1 ";" $2 ";" $3 ";" $5
}
END {
	print NewRecord
} ' CRA > RES.csv
RES.csv :

Code :
1
2
3
4
 
id;code;date;compte;telephone;adresse
1;23;1207;val1;t1;test
2;25;1107;val2;t2;titi
__________________
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 03/12/2007, 12h58   #7
Invité de passage
 
Inscription : novembre 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 11
Points : 1
Points : 1
Par défaut awk urgent svp

Merci beaucoup,
ça marche !!

milles merci !!
bstages2000 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 02h01.


 
 
 
 
Partenaires

Hébergement Web