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

Unix Discussion :

awk avec tableaux


Sujet :

Unix

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 72
    Par défaut awk avec tableaux
    Bonjour,

    GROS problème sur un awk et dites moi au moins que cela est possible car de ce que j'ai trouvé sur le net, rien ne m'indiquait une possibilité ... après je n'ai peut-être pas les termes exact pour effectué ma recherche.

    Ce que je voudrais faire :
    Faire passer des paramètres à la commande awk, dont un qui est un tableau. (simplement un tableau simple avec des valeurs)
    et je voudrais ensuite réutilisé ce tableau pour l'exploité

    Ce que j'ai fait jusqu'a maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    # je rempli mon tableau a longueur variable TAB_KEY[n]
     
    awk ... -v tab=${TAB_KEY[0]} -v nb_idx=${#TAB_KEY[*]}'
    {
          print tab
    }
    ' monFichier
    Resultat pour l'instant
    il me retourne logiquement que le premier résultat du tableaux (index 0)

    Resultat attendu
    Je voudrais qu'il me retourne chaque résultat de chaque index pour pouvoir l'exploiter

    Helllllllllllllllllllp me, pleaaaaaaaaaaaaaaaase



    j'espère avoir bien expliqué, merci a vous

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 72
    Par défaut commande awk
    Re,

    Autre solution ... peut-être plus simple.

    ma commande awk se base a partir d'un fichier 1, je voudrais passer en paramètres un fichier où j'irai récupérer les valeurs.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    awk -F .... -v fichier_2=/fnnsfn/sdfds/sdf ... '
    {
         ...
    } 
    ' fichier_1
    Et maintenant mon fichier_2 ressemble à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1;2;3
    2;2;4
    5;2;7
    je voudrais donc récupérer la première partie (une partie est séparé de ; ) et la 2eme, le concaténer et si cette valeur correspond a la concaténation de 2 champ du fichier_1 alors recupérer 3 eme champs.


    J'espere avoir été clair, pas simple en même temps, demandez moi au pire.


    RECAPITULATIF :
    1- Recuperer 1ere ligne du fichier_2
    ex : 1;2;3
    2- Recuperer 2 premier champ
    ex : 1 et 2
    3- Concatener ces 2 champs
    ex : 12
    4- Comparer à un champ du fichier_1
    5- Si VRAI, recuperer 3eme champ
    ex : 3
    6- Si FAUX, boucler pour la ligne suivante

    Voila



    Merci de votre aide

  3. #3
    Membre émérite 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
    Par défaut
    Moi, je ferais comme ça (tableau associatif)
    http://www.shellunix.com/awk.html
    http://lea-linux.org/cached/index/Dev-awk.html



    fichier_1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    a;b;c;d;e;f;g;h
    a;b;c;12;e;f;g;h
    a;b;c;22;e;f;g;h
    a;b;c;52;e;f;g;h
    a;b;c;d;e;f;g;h
    fichier_2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1;2;3
    2;2;4
    5;2;7

    Script :
    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
     
    awk -v fichier_2=fichier_2.txt  '
    function FctChrgt()
    {
    	print "* Chargement du tableau des index"
    	while (getline Tbuffer < fichier_2 > 0) {
    		split(Tbuffer,Tab,/;/)
    		Tind=Tab[1]""Tab[2]
    		Tval[Tind]=Tab[3]
    	}
    	print "* FIN Chargement du tableau des index"
    }
    BEGIN {
    	FS=";"
    	OFS=";"
    	FctChrgt()
    }
    {
    	if (Tval[$4] != "") {
    		$4=Tval[$4] 
    	}
    	print $0
    } ' fichier_1.txt
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a;b;c;d;e;f;g;h
    a;b;c;3;e;f;g;h
    a;b;c;4;e;f;g;h
    a;b;c;7;e;f;g;h
    a;b;c;d;e;f;g;h

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 72
    Par défaut
    GRAND merci pour ton aide, ca m'as bien aidé, et j'ai mieux compris comment utilisé l'intérieur d'un awk, malgré je trouve cela pas très habituelle l'utilisation des tableaux ou alors je suis très fatigués.

    Resultat FINAL :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    awk -v ficRef=fichier_2.txt  '
    function FctChrgt()
    {
    	cpt=0;
            # Pour chaque ligne du fichier passé en paramètre du awk
    	while (getline Tbuffer < ficRef > 0) 
            {
                    # Recuperer chaque valeur séparé par ";"
    		split(Tbuffer,Tab,/;/)
                    # Mettre ma 1ère valeur recuperer sur 4 caracteres (cadré à gauche avec des espaces à droite)
    		Tab[1]=sprintf("%-4s",Tab[1]);
                    # Mettre ma 2ème valeur recuperer sur 1 caractere (cadré à gauche avec des espaces à droite)
    		Tab[2]=sprintf("%-1s",Tab[2]);
                    # Concaténer les deux et mettre sa valeur dans le tableaux[n] : formant une clé
    		tabKey[cpt]=Tab[1]""Tab[2];
                    # Mettre le resultat correspondant dans le tableaux2[n] : formant le résultat de la clé
    		tabRes[cpt]=Tab[3];
                    # Incrementer compteur
    		cpt++;
    	}
    }
    BEGIN {
    	FS=";"
    	OFS=";"
    	FctChrgt()
    }
    {
            # Recuperation et concatenation de 2 valeurs  recuperer ultérieurement de fichier_1.txt  (pas présent ici)
    	Var=tabTicket[15]""tabTicket[17];
            # Pour chaque valeur du tableau 
    	for (k=0;k<cpt;k++)  
    	{
                    # Comparer si la clé du tableaux a l'index k est identique à la valeur de var
    		if(tabKey[k] == Var) {
                            # Si OUI, inscrire sa valeur dans une variables et sortir (astuce : mettre l'index k = à la taille du tableaux)
    			typeMUSI=tabRes[k];
    			k=cpt;
    		}
    		else
    		{
                            # Si NON, mettre à vide la variable
    			typeMUSI="    "; 
    		}
    	}
    ...
    
    } ' fichier_1.txt
    Et voila. merci encore et @ la prochaine

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

Discussions similaires

  1. [RTFTemplate] List avec tableaux
    Par maxf1 dans le forum Documents
    Réponses: 6
    Dernier message: 24/06/2008, 08h40
  2. Mise en page PDF vers html avec tableaux et images
    Par guyoms dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 28/03/2007, 00h14
  3. Vérification de système linéaire, avec tableaux
    Par lenny_ dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 13/06/2006, 17h51
  4. Problème avec tableaux dynamiques et procédure
    Par K20 dans le forum Langage
    Réponses: 11
    Dernier message: 06/01/2006, 20h51
  5. Réponses: 11
    Dernier message: 12/04/2005, 14h08

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