awk et variable

awk et variable - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 12-02-2008 à 18:00:32    

Bonjour,  
 
J'ai un script dans lequel je place une commande pour me rajouter un mot en première position de chaque ligne.  
La commande que j'utilise est  de type  awk '{print TOTO $0}' monfichier.txt  
 
Le problème c'est que le mot que je souhaite rajouter change , je l'ai donc stocké dans une variage que j'ai appelé $i.  
 
Si je fais : awk '{print $i $0}' monfichier.txt    le $i n'est pas interprété correctement.  
 
J'ai essayé de passer par une commande "echo" pour m'en sortir mais là encore sans succès  
 
 
awk '{print 'echo $i' $0}' monfichier.txt  
awk '{print `echo $i` $0}' monfichier.txt  
awk '{print echo $i $0}' monfichier.txt  
 
La dernière commande echo $i ne me fait pas d'erreur, mais me sort la même chose que si j'avais tapé awk '{print $0 $0}' ... et bien évidemment $i n'a pas une valeur nulle ...  
(Autre précision, une ligne plus bas, toujours dans ma boucle l'appel un echo "$i Traité OK" et la valeur apparait bien, donc j'écarte l'hypothèse d'un glissement de variage).  
 
 
Marche pas.  
 
Merci .


Message édité par tabasko le 12-02-2008 à 18:04:37
Reply

Marsh Posté le 12-02-2008 à 18:00:32   

Reply

Marsh Posté le 12-02-2008 à 18:11:13    

Je suppose que $i est initialisé dans ton shell et non dans ton programme awk...
 
Il faut donc initialiser une autre variable i dans ton programme awk:
 
awk  '{print i $0}'  i=$i  monfichier.txt


---------------
C'est pas bon, Neriki, tu recommences à glander, là. :o
Reply

Marsh Posté le 12-02-2008 à 18:11:30    

avec sed ça donnerait un truc comme ça
sed -e 's|^|'$toto' |g' lapin.txt >carotte.txt


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 13-02-2008 à 09:46:43    

neriki a écrit :

Je suppose que $i est initialisé dans ton shell et non dans ton programme awk...
 
Il faut donc initialiser une autre variable i dans ton programme awk:
 
awk  '{print i $0}'  i=$i  monfichier.txt


 
Ca fonctionne !!! Merci pour vos différentes solutions ... je conserve celle ci dessus qui est de la synatxe la plus simple et proche de ce que je faisais.
Merci pour la combine sed je la note je pourrai bien m'en resservir :)
 
Mr Harry, $i étant une variable dans une boucle je ne peux lui appliquer sa valeur dans mon script  :heink:  
 
a+


Message édité par tabasko le 14-02-2008 à 09:44:16
Reply

Marsh Posté le 14-02-2008 à 14:33:30    

Je tente aujourd'hui de faire quelques choses de similaire et je rebloque à nouveau :
 
 
rm monfichier.txt
 
for i in `cat liste.tel`
do
 
awk '$5 ~ /tel/'   tel=$i fichier.txt >> resultat.txt
 
done
 
 
Je cherche à extraire du fichier "ficher.txt" toutes les lignes qui contienne en colonne 5 le numéro de tel qui apparait dans la boucle (du fichier liste.tel). Je n'arrive pas à lui forcer l'usage de la valeur de variable.
 
 
 
Marche pas ....
 
Je souhaite faire simple et rester le plus proche possible de cette ligne de commande.
Merci

Message cité 1 fois
Message édité par tabasko le 14-02-2008 à 14:34:59
Reply

Marsh Posté le 14-02-2008 à 14:55:20    

tabasko a écrit :

Je tente aujourd'hui de faire quelques choses de similaire et je rebloque à nouveau :
 
 
rm monfichier.txt
 
for i in `cat liste.tel`
do
 
awk '$5 ~ /tel/'   tel=$i fichier.txt >> resultat.txt
 
done
 
 
Je cherche à extraire du fichier "ficher.txt" toutes les lignes qui contienne en colonne 5 le numéro de tel qui apparait dans la boucle (du fichier liste.tel). Je n'arrive pas à lui forcer l'usage de la valeur de variable.
 
 
 
Marche pas ....
 
Je souhaite faire simple et rester le plus proche possible de cette ligne de commande.
Merci

un truc comme ça devrait marcher, je pense :

for i in `cat liste.tel`
do
  awk "\$5 ~ /$i/" fichier.txt >> resultat.txt
done


---------------
TriScale innov
Reply

Marsh Posté le 14-02-2008 à 14:57:11    

PARFAIT ! Merci francesco cela fonctionne ...

Reply

Marsh Posté le 14-02-2008 à 15:56:36    

Bon ca se complique (comme toujours lol).
 
Le morceau de script pour lequel vous m'avez aidé fonctionne , ce n'est plus le problème.
 
Le problème c'est que $i que je cherche et extrait de mon fichier source, à une taille (nombre de caractère) qui est variable.
Je cherche à faire des associations strictes. Dans l'état, ma commande extrait la ligne si le champs en question contient la valeur $i.
 
Je sais pas si je m'explique clairement :
 
Mettons que ma variable dans sa boucle prend la valeur de 1234.
Le fichier source que je consulte en colonne4 pour faire mon extract, doit posséder cette valeur très exactement "1234".
Actuellement si mon script rencontre en colonne4 9991234999 il va tout de même extraire la ligne (alors je que je ne le souhaite pas).
 
Attention ce qui vient rendre plus complexe la situation, c'est que le nombre de chiffre de $i peut varier.
 
Je ne connais pas la syntaxe pour demande à AWK de prendre la scricte valeur (et non plus tout ce qui contient et/ou est la variable en elle même).
 
Merci pour ceux qui prennent le temps de comprendre :) et de répondre ...


Message édité par tabasko le 14-02-2008 à 15:59:19
Reply

Marsh Posté le 14-02-2008 à 16:05:53    

Je viens à tout hasard essayer ceci ....
 

Citation :

for i in `cat liste.tel`  
do  
  awk "\$5 == $i " fichier.txt >> resultat.txt  
done


 
ceci semble fonctionner :)

Reply

Marsh Posté le 14-02-2008 à 17:51:46    

Oui ça fonctione, mais la solution qui consiste à passer la variable à awk (avec awk '...' i=$i ou awk -v i=$i '...') est infiniment meilleure.

Reply

Marsh Posté le 14-02-2008 à 17:51:46   

Reply

Marsh Posté le 15-02-2008 à 09:14:12    

matafan a écrit :

Oui ça fonctione, mais la solution qui consiste à passer la variable à awk (avec awk '...' i=$i ou awk -v i=$i '...') est infiniment meilleure.

Pourquoi ?


---------------
TriScale innov
Reply

Marsh Posté le 15-02-2008 à 09:36:10    

Parce que faire générer le script awk par le shell, c'est crade. En plus d'être illisible si ton script fait plus que quelques lignes.

Reply

Marsh Posté le 15-02-2008 à 10:11:42    

:jap:


---------------
TriScale innov
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed