Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Unix

Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix

Réponse
 
Outils de la discussion
Vieux 02/06/2008, 18h31   #1 (permalink)
Futur Membre du Club
 
Date d'inscription: octobre 2007
Messages: 39
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 :
# 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
gdev7 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 02/06/2008, 19h06   #2 (permalink)
Futur Membre du Club
 
Date d'inscription: octobre 2007
Messages: 39
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 :
awk -F .... -v fichier_2=/fnnsfn/sdfds/sdf ... '
{
     ...
} 
' fichier_1
Et maintenant mon fichier_2 ressemble à ca :
Code :
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
gdev7 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 02/06/2008, 22h27   #3 (permalink)
Membre éprouvé
 
Avatar de BlaireauOne
 
Date d'inscription: mars 2007
Localisation: Toulouse
Messages: 471
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 :
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 :
1;2;3
2;2;4
5;2;7

Script :
Code :
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 :
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
__________________
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
Vieux 03/06/2008, 17h19   #4 (permalink)
Futur Membre du Club
 
Date d'inscription: octobre 2007
Messages: 39
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 :
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
gdev7 est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Unix



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide


Fuseau horaire GMT +1. Il est actuellement 12h40.