IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Problème avec awk


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 6
    Points
    6
    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.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Essaye ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $awk -f cmdes-awk ton-fichier-a-modifier
    cmdes-awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 6
    Points
    6
    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

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Dans le bloc BEGIN, ajoute simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 6
    Points
    6
    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;...)

  6. #6
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Procédure awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut awk urgent svp
    Merci beaucoup,
    ça marche !!

    milles merci !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec AWK
    Par nicnictout dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 01/04/2011, 17h34
  2. problème avec Awk
    Par morgoths dans le forum Linux
    Réponses: 1
    Dernier message: 21/04/2010, 16h37
  3. Problème avec awk et un pipe
    Par Chatbour dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 14/10/2007, 11h40
  4. problème avec la commande awk
    Par salseropom dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 05/06/2007, 13h02
  5. Problème avec awk
    Par Michaël dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/08/2006, 13h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo