awk: lecture d'un fichier par un autre fichier

awk: lecture d'un fichier par un autre fichier - Shell/Batch - Programmation

Marsh Posté le 18-10-2012 à 17:01:31    

Bonjour  
Je souhaite utiliser un fichier(appelé seuil) ayant des valeur min et max pour borner un autre fichier appelé typ_sp
Voici mon fichier seuil :  
Marq minT MaxT MinR MaxR Al
1  0.8 0.93  0.02  0.05  A  
2  0.01  0.3  0.02  0.9  Z
3  0.05  0. 25 0.02  0.08  ZR
.
 
Voici mon fichier typ_sp (la 1ère ligne, description des colonnes, n’est normalement pas dans le fichier)
N° Nom Marq A1 A2 Val_T Valeur_R
28 TN0228     1 G G 0.932 0.112
32 TN0228     1 - - 0.929 0.046
36 TN0228     1 - - 0.845 0.053
810 X2287     2 T T 0.793 0.105
816 X2287     2 - - 0.251 0.040
817 X2287     2 A A 0.000 0.728
 
Je souhaite avoir ceci
28 TN02F28 1 G G 0.932 0.112
32 TN02F28 1 A A 0.929 0.046
36 TN02F28 1 - - 0.845 0.053
06 X246287 2 T T 0.896 0.188
810 X246287 2 T T 0.793 0.105
816 X246287 2 Z Z 0.251 0.040
817 X246287 2 A A 0.000 0.728
 
Voici mon code. En théorie ça devrait fonctionner mais en pratique c'est autre chose....

Code :
  1. gawk 'BEGIN{SEUIL=ARGV[1];SP=ARGV[2]}
  2.          {if(FILENAME==SEUIL){
  3.               marq[$1]=$1 ; Min_t [$1]=$2 ; Max_t [$1]=$3 ; Min_R[$1]=$4 ; Max_R[$1]=$5 ; Al[$1]=$6}
  4.           if(FILENAME==SP){
  5.               if ($4!="-" ) {print $0}
  6.             else {
  7.               if ($4=="-" && $6>=$Min_t[$1] && $6<=$Max_t[$1] && $7>=$Min_R[$1] && $7<=$Max_R[$1]) { $4=$Al[$1]; $5=$Al[$1]; print $0 }
  8.              else {print $0}}}
  9.          }' seuil typ_sp > test


Merci pour votre aide

Reply

Marsh Posté le 18-10-2012 à 17:01:31   

Reply

Marsh Posté le 19-10-2012 à 03:26:41    

salut,
 

Code :
  1. gawk 'BEGIN{SEUIL=ARGV[1];SP=ARGV[2]}
  2.    { 
  3. # en général, on compare FNR et NR
  4.       if(FILENAME==SEUIL){
  5.          marq[$1]=$1
  6.          Min_t [$1]=$2 #il y a un espace en trop
  7.          Max_t [$1]=$3
  8.          Min_R[$1]=$4
  9.          Max_R[$1]=$5
  10.          Al[$1]=$6
  11.       } 
  12.       if(FILENAME==SP){
  13.          if ($4!="-" ) {
  14.             print $0
  15.          }else {
  16. #les variables n'ont pas de '$'
  17. # une valeur ne peut pas être sup _et_ inf à une autre
  18.             if ($4=="-" && $6>=$Min_t[$1] && $6<=$Max_t[$1] && $7>=$Min_R[$1] && $7<=$Max_R[$1])
  19.                { 
  20.                   $4=$Al[$1]
  21.                   $5=$Al[$1]
  22.                   print $0
  23.                }else {
  24.                   print $0
  25.                } 
  26.          } 
  27.       } 
  28.    }' seuil typ_sp > test


 
comme ça:

Code :
  1. #!/usr/bin/gawk -f
  2. BEGIN{FS=OFS}
  3. {
  4.    if (FNR==NR){
  5.       Min_t[$1]=$2
  6.       Max_t[$1]=$3
  7.       Min_R[$1]=$4
  8.       Max_R[$1]=$5
  9.       Al[$1]=$6
  10.    }else{
  11.       if($4=="-" && ($6<=Min_t[$1] || $6>=Max_t[$1]) && ($7<=Min_R[$1] || $7>=Max_R[$1])){
  12.          $4=$5=Al[$3]
  13.       }
  14.       $1=$1
  15.       print
  16.    } 
  17. }

le formatage n'est pas respecté :(

Code :
  1. ./monScriptAwk seuil typ_sp
  2. N° Nom Marq A1 A2 Val_T Valeur_R
  3. 28 TN0228 1 G G 0.932 0.112
  4. 32 TN0228 1 A A 0.929 0.046
  5. 36 TN0228 1 A A 0.845 0.053
  6. 810 X2287 2 T T 0.793 0.105
  7. 816 X2287 2 Z Z 0.251 0.040
  8. 817 X2287 2 A A 0.000 0.728

parce que sur la ligne

Code :
  1. 36 TN0228 1 - - 0.845 0.053

0.053 >= 0.05
 
tu devrais vérifier tes fichiers de données.


Message édité par Profil supprimé le 19-10-2012 à 03:28:57
Reply

Marsh Posté le 19-10-2012 à 08:18:41    

Justement c'est normal. Le fichier est correct (sauf l'espace en trop).
Certaines valeurs sont en dehors des clous (c'est le cas de 36 TN0228 1)  et donc elles doivent rester - -
Théoriquement ça devrait fonctionner mais pratiquement non
le FNR==NR  permet de séparer la lecture du premier et du second fichier?
 

Reply

Marsh Posté le 19-10-2012 à 08:30:27    

Petit complément si je ne met qu'une condition ( $6<=Min_t[$1])le script fonctionne mais dès que j'enchaine 2 conditions ou plus ($6<=Min_t[$1] && $6>=Max_t[$1]) cela ne fonctionne plus.
Il s'agit bien de && et non || car la valeur doit être comprise entre les 2 bornes du fichier seuil

Reply

Marsh Posté le 19-10-2012 à 13:50:54    

Je viens de trouver....
L'identifiant commun n'était pas à la bonne place ....donc il ne trouvait rien de commun entre les 2 fichiers

Reply

Marsh Posté le 19-10-2012 à 15:16:09    

Citation :

la valeur doit être comprise entre les 2 bornes du fichier seuil

pour effectuer la mise à jour, ou pour afficher sans rien changer ?

Message cité 1 fois
Message édité par Profil supprimé le 19-10-2012 à 15:17:43
Reply

Marsh Posté le 19-10-2012 à 21:05:33    


 
pour effectuer les MAJ
ça revient à : Min_T<=Valeur de $6>=Max_T  alors on change la valeur de $4 et $5
 

Reply

Marsh Posté le 19-10-2012 à 22:13:42    

ok, donc:

Code :
  1. si ( valMin <= valeur && valeur <= valMax); alors modif; finsi

sinon valeur n'a quà être supérieur à valMax.


Message édité par Profil supprimé le 19-10-2012 à 22:14:55
Reply

Marsh Posté le 20-10-2012 à 14:20:05    

exact pour le code
 et si les conditions ne sont pas remplies car val<min ou >max alors on ne change rien
Du coup je ne me sers pas de FNR==NR. On doit surement le mettre quand on travaille sur un fichier unique

Reply

Marsh Posté le 20-10-2012 à 19:43:34    

Citation :

Du coup je ne me sers pas de FNR==NR.

Ça n'a aucun rapport.
 
 

Citation :

On doit surement le mettre quand on travaille sur un fichier unique

Justement, non !
Comparer FNR à NR permet de savoir quand la lecture du deuxième fichier débute, car FNR est alors réinitialisé, alors NR est encore incrémenté.
Quand on a plus de deux fichiers, on peut forcer la réinitialisation de NR à ce moment-là.
 
C'est quand même plus léger que de tester les noms des fichiers. ;)


Message édité par Profil supprimé le 20-10-2012 à 19:43:47
Reply

Marsh Posté le 20-10-2012 à 19:43:34   

Reply

Marsh Posté le 21-10-2012 à 21:16:56    

Ce qui signifie quand tu as 3 fichiers et tu appelles ton programme : prog.awk fichier1 fichier2 fichier3
tu mets ton FNR==NR en begin et ensuite tu mets tes conditions du fichier1, puis du fichier2 et du fichier3 et il attribue automatiquement chaque condition à chaque fichier ?
 

Reply

Marsh Posté le 21-10-2012 à 22:39:39    

pas exactement, ça permet surtout de détecter le passage d'un fichier à un autre.

Reply

Sujets relatifs:

Leave a Replay

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