Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1119 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

   awk: lecture d'un fichier par un autre fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

awk: lecture d'un fichier par un autre fichier

n°2160677
iguanic
Posté le 18-10-2012 à 17:01:31  profilanswer
 

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

mood
Publicité
Posté le 18-10-2012 à 17:01:31  profilanswer
 

n°2160718
Profil sup​primé
Posté le 19-10-2012 à 03:26:41  answer
 

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
n°2160724
iguanic
Posté le 19-10-2012 à 08:18:41  profilanswer
 

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?
 

n°2160725
iguanic
Posté le 19-10-2012 à 08:30:27  profilanswer
 

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

n°2160772
iguanic
Posté le 19-10-2012 à 13:50:54  profilanswer
 

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

n°2160793
Profil sup​primé
Posté le 19-10-2012 à 15:16:09  answer
 

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
n°2160809
iguanic
Posté le 19-10-2012 à 21:05:33  profilanswer
 


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

n°2160815
Profil sup​primé
Posté le 19-10-2012 à 22:13:42  answer
 

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
n°2160830
iguanic
Posté le 20-10-2012 à 14:20:05  profilanswer
 

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

n°2160848
Profil sup​primé
Posté le 20-10-2012 à 19:43:34  answer
 

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
mood
Publicité
Posté le 20-10-2012 à 19:43:34  profilanswer
 

n°2160901
iguanic
Posté le 21-10-2012 à 21:16:56  profilanswer
 

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 ?
 

n°2160903
Profil sup​primé
Posté le 21-10-2012 à 22:39:39  answer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

   awk: lecture d'un fichier par un autre fichier

 

Sujets relatifs
Lecture, insertion/création fichierLecture de fichier
Question sur lecture fichierexplication et lecture d'un fichier binaire(C3D)
pb liste chainée et lecture de fichier CCompilation parser XML pour intégration à un code C
Lecture et recopie d'une matrice depuis un fichier texteProblème de lecture d'un fichier avec fread
optimiser le temps de lecture d'un gros fichierContrôles lors de la lecture d'un fichier xml
Plus de sujets relatifs à : awk: lecture d'un fichier par un autre fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR