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 19/09/2006, 19h37   #1
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 0
Points : 0
Par défaut Problème awk pour récuperer des champs

Bonjour,
je souhaite récuperer le champs $2 sous certaines conditions :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 for nom in $(awk 'BEGIN{FS=";"}{print $1}' < verif2.log )
 do
 
 for compte in $(awk 'BEGIN{FS=";"}{print $1}' < verif1.txt )
 
 do
 
if [ $nom = $compte ]
 then
# awk 'BEGIN{FS=";" ; nom_exp=$nom }{$1 == nom_exp} {print $2}' verif1.txt > resultat_final.log
# awk '{if ($1 == $nom) {print $2} fi }' verif1.txt > resultat_final.log
 fi
 done
 done
Merci pour la réponse
ab_2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 10h03   #2
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 0
Points : 0
Par défaut awk et comparaison fichiers

bonjour,
j'ai testé les deux techniques (voir dans le commentaire du code shell #mais ça ne marche pas)
pouvez-vous me dire comment je pourrais comparer la valeur d'une variable avec le premier champs d'un fichier , en cas d'égalité je récupere le deuxieme champs du fichier.?
merci
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
for nom in $(awk 'BEGIN{FS=";"}{print $1}' < verif2.log )
 do
 
 for compte in $(awk 'BEGIN{FS=";"}{print $1}' < verif1.txt )
 
 do
 
if [ $nom = $compte ]
 then
##############################################
awk 'BEGIN{FS=";" ; nom_exp=$nom }{$1 == nom_exp} {print $2}' verif1.txt > resultat_final.log
awk '{if ($1 == $nom) {print $2} fi }' verif1.txt > resultat_final.log
################################################### 
fi
 done
 done
ab_2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 10h18   #3
Membre Expert
 
Avatar de zooro
 
Inscription : avril 2006
Messages : 922
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 922
Points : 1 149
Points : 1 149
Bonjour,
Utilises les balises CODE pour rendre la lecture de ton code plus facile.

Je n'ai pas la possibilité de tester, mais il me semble que tes simples cotes '...' empêchent l'interprétation de la variable $nom par le shell.
__________________
[alkama] quelqu'un est allé voir la guerre des mondes?
[@Chrisman] j'espère pour spielberg
--- bashfr.org
zooro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 10h58   #4
Rédacteur
 
Inscription : mars 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 298
Points : 1 450
Points : 1 450
zooro a raison les cotes "bloque" l'interpretation de tes variables shell ....

il te faut utiliser la passation d'argument avec awk :
Code :
1
2
3
4
5
6
7
8
9
 
 -v var=val
       --assign var=val
              Assign the value val to the variable var, before execution of the  program  begins.
              Such variable values are available to the BEGIN block of an AWK program.
 
 
soite :
awk -v var_awk=$var_shell 'prog awk'
__________________
Marc
Slackware for ever ......
BASH - KSH ( http://marcg.developpez.com/ksh/ )
MarcG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 14h14   #5
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 0
Points : 0
j'ai modifié la partie correspondantes :


Code :
1
2
3
4
5
6
7
8
9
10
11
for nom in $(awk 'BEGIN{FS=";"}{print $1}' < verif2.log )
 do
 
 for compte in $(awk 'BEGIN{FS=";"}{print $1}' < verif1.txt )
 
 do
if [ $nom = $compte ]
 then
###########################################
awk '{FS=";"}{if ($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
#########################################
le resultat :
The input line number is 1. The file is verif1.txt.
The source line number is 1.
awk: A statement occurred that is not valid
ab_2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 14h32   #6
Membre Expert
 
Avatar de zooro
 
Inscription : avril 2006
Messages : 922
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 922
Points : 1 149
Points : 1 149
Citation:
Envoyé par ab_2006
Code :
awk '{FS=";"}{if ($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
le resultat :
The input line number is 1. The file is verif1.txt.
The source line number is 1.
awk: A statement occurred that is not valid
Euh... il faudrait peut-être mettre des guillements autour de ton $nom, non ?
Et en plus, imagine que $nom="bla bla) bla". Après interprétation du shell, tu pourrais avoir un code awk du genre:
Code :
{FS=";"}{if ($1 ==bla bla) bla) {print $2} fi}
On comprend qu'il n'apprécie pas
__________________
[alkama] quelqu'un est allé voir la guerre des mondes?
[@Chrisman] j'espère pour spielberg
--- bashfr.org
zooro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 15h22   #7
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 0
Points : 0
ça ne marche toujours pas :

Code :
awk '{FS=";"}{if($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
ci-dessous le message d'erreur :
Citation:
The input line number is 1. The file is verif1.txt.
The source line number is 1.
awk: A statement occurred that is not valid.
Quelle est la regle ?
merci par avance
ab_2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 15h30   #8
Membre Expert
 
Avatar de zooro
 
Inscription : avril 2006
Messages : 922
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 922
Points : 1 149
Points : 1 149
Citation:
Envoyé par ab_2006
ça ne marche toujours pas :
Code :
awk '{FS=";"}{if($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
Quelle est la regle ?
merci par avance
Je ne peux pas tester, alors pas de garantie de succès. Mais essaye comme ça :
Code :
awk '{FS=";"}{if($1 =="'$nom'") {print $2} fi}' verif1.txt > resultat_final.log
Ou sinon, essaye la solution donnée plus haut par MarcG.
__________________
[alkama] quelqu'un est allé voir la guerre des mondes?
[@Chrisman] j'espère pour spielberg
--- bashfr.org
zooro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 16h23   #9
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 0
Points : 0
Merci zooro, mais ça ne marche toujours pas .


The source line number is 1.
awk: A statement occurred that is not valid.

The input line number is 1. The file is verif1.txt.
The source line number is 1.
awk: A statement occurred that is not valid.


merci a toute suggestion pour la résolution
ab_2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 16h38   #10
Membre Expert
 
Avatar de zooro
 
Inscription : avril 2006
Messages : 922
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 922
Points : 1 149
Points : 1 149
Code :
awk '{FS=";"}{if($1 =='$nom') {print $2} fi}' verif1.txt > resultat_final.log
Je n'avais pas percuté, mais le "fi", tu le sors d'où ?

Essaye comme ça:
Code :
awk -F';' '$1 == "'$nom'" { print $2 }' verif1.txt > resultat_final.log
__________________
[alkama] quelqu'un est allé voir la guerre des mondes?
[@Chrisman] j'espère pour spielberg
--- bashfr.org
zooro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 18h39   #11
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 0
Points : 0
ça marche pour le premier enregistrement, ensuite il s'arrete.

en avance, mais il manque un petit bout de code, pour récuperer tous les enregistrement sachant que j'ai déja deux boucles for.


Merci à tous
ab_2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 19h53   #12
Membre Expert
 
Avatar de zooro
 
Inscription : avril 2006
Messages : 922
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 922
Points : 1 149
Points : 1 149
Justement, en parlant des boucles, je relis ton code initial, et j'ai un peu de mal à suivre.
Juste pour être sûr que j'ai bien compris ce que tu veux faire :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Pour chaque $nom (1er champ de chaque ligne du fichier verif2.log) faire
   Pour chaque $compte (1er champ de chaque ligne du fichier verif1.txt) faire
      Si $nom = $compte faire
         Pour chaque ligne de verif1.txt, 
            Si le premier champ de la ligne (i.e. $compte) est $nom, 
               afficher le deuxième champ
            finSi
         finPour
      finSi
   finPour
finPour
__________________
[alkama] quelqu'un est allé voir la guerre des mondes?
[@Chrisman] j'espère pour spielberg
--- bashfr.org
zooro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 22h11   #13
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 0
Points : 0
exa
ab_2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 22h19   #14
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 0
Points : 0
salut zooro

exactement, tu as tous compris. je te confirme trois boucles for.

merci
ab_2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 22h19   #15
Membre Expert
 
Avatar de zooro
 
Inscription : avril 2006
Messages : 922
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 922
Points : 1 149
Points : 1 149
Je ne comprends pas à quoi sert cette partie du code :
Code :
1
2
3
4
for compte in $(awk 'BEGIN{FS=";"}{print $1}' < verif1.txt )
 do
if [ $nom = $compte ]
 then
Sauf erreur de ma part, elle fait la même chose que le awk qui suit...
__________________
[alkama] quelqu'un est allé voir la guerre des mondes?
[@Chrisman] j'espère pour spielberg
--- bashfr.org
zooro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 09h36   #16
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 0
Points : 0
bonjour,

le awk qui suit récupere le deuxieme champs du fichier verif1 a condition que
le premier champs du fichier verif1=premier champs du fichier verif2.

Question que je me pose y'a t-il un moyen de récupérér dans la boucle for une variable qui est composé de deux champs d'une ligne ensuite extraire de cette variable un champs de cette ligne.

Merci
ab_2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h40.


 
 
 
 
Partenaires

Hébergement Web