REXX vers UNIX

REXX vers UNIX - Shell/Batch - Programmation

Marsh Posté le 06-12-2007 à 12:30:06    

Bonjour tout le monde j'ai besoin de votre aide SVP, j'ai un programme REXX que je souhaite le traduire en KSH :
le programme rexx est le suivant :
 
/* REXX */                                                                  
          /* LIST LA PROFONDEUR DES QUEUES                       */          
          /* ET EDIT UN LISTING POUR LE SUIVI SUR MQMG           */          
/*TRACE I*/                                                                  
DROPBUF 0                                                                    
                 CALL LIRE                                                  
                 CALL AFFICHE                                                
EXIT RC                                                                      
/********************************************************************/      
LIRE:                                                                        
      "EXECIO * DISKR IN (STEM ENR. FINIS"                                  
 RETURN                                                                      
/********************************************************************/      
AFFICHE:                                                                    
I = 0                                                                        
NOM = ' '                                                                    
COMP = ' '                                                                  
   DO I = 1 TO ENR.0                                                        
    L2 = ' '                                            
    M2 = 0                                              
    IF POS('QUEUE(',ENR.I) > 0 THEN DO                  
       NOM = TRANSLATE(ENR.I,' ','(')                  
       NOM = TRANSLATE(NOM,' ',')')                    
       PARSE VALUE NOM WITH L1 L2 L3                    
            IF L1 = 1 THEN DO                          
               L1 = L2                                  
               L2 = L3                                  
               L2 = SPACE(L2,0)                        
            END                                        
       L2 = LEFT(L2,30)                                
       I = I + 2                                        
       COMP = TRANSLATE(ENR.I,' ','(')                  
       COMP = TRANSLATE(COMP,' ',')')                  
       PARSE VALUE COMP WITH M1 M2 M3                  
       M2 = RIGHT(M2,8)                                
          IF M2 > 0 THEN DO                            
              PUSH L2!!'  NOMBRE DE MSG :  '!!M2        
              "EXECIO 1 DISKW OUT ("                                    
          END                                                            
    END                                                                  
  END                                                                    
RETURN                                                                  
/********************************************************************/    
 
 
Merci de me soutenir sur ce sujet.
 
Merci d'avance
 

Reply

Marsh Posté le 06-12-2007 à 12:30:06   

Reply

Marsh Posté le 06-12-2007 à 13:46:30    

Je te soutiens. Go, go, go !  [:dion]

Reply

Marsh Posté le 07-12-2007 à 17:34:43    

hhhhhhhhhhhhhhh Elmoricq, mais je te remercie car avec ton go ,go ,go j'ai pu trouver la solution "hamedoulahe"
..............................................................

Reply

Marsh Posté le 13-12-2007 à 09:45:55    

Voici quelques éléments d'explication du programme REXX.
 

     "EXECIO * DISKR IN (STEM ENR. FINIS"  


Lecture du fichier IN dans le tableau ENR
La notation ENR.I est équivalante à la notation tableau ENR[I].
L'élément 0 contient le nombre d'éléments dans le tableau (hors 0).
 

  DO I = 1 TO ENR.0  
      . . . .
   END


Boucle sur le traitement de toutes les lignes du fichier contenues dans le tableau ENR
ENR.I -> Ligne I du fichier.
 

   IF POS('QUEUE(',ENR.I) > 0 THEN DO  
      . . . .                
    END


On teste la présence de la chaîne 'QUEUE(' dans la ligne en cours.
La fonction POS retourne la position de la chaîne (0 si non trouvée).
 

      NOM = TRANSLATE(ENR.I,' ','(')                  
       NOM = TRANSLATE(NOM,' ',')')  


La variable NOM reçoit la ligne en cours et l'on remplace les caractères '(' et ')' par des espaces.  
 

      PARSE VALUE NOM WITH L1 L2 L3


La variable NOM est décomposée en mots dans les variables L1 L2 et L3.
La variable L3 reçoit le 3eme mot et les suivants.
 
 

              L2 = SPACE(L2,0)

                                       
Tous les espaces contenus dans la variable L2 sont supprimés.
 

      L2 = LEFT(L2,30)

                               
La variable L2 ne conserve que les 20 premiers caractères.
Si elle à une lonfueur inférieure à 20 on complete avec des espaces.
 
 

      I = I + 2

                                       
La variable I est utilisé comme numéro de la ligne en cours.
On fait +2, I pointe maintenant deux lignes plus loin.
 

             PUSH L2!!'  NOMBRE DE MSG :  '!!M2        
              "EXECIO 1 DISKW OUT ("

                                   
On écrit sur le fichier sorte OUT la chaîne résultat de la concaténation de L2, ' NOMBRE DE MSG : ' et M2
 
 
 
Voici un équivalant (enfin presque, non testé) en awk :

/QUEUE\(/ {
 
   NOM = $0;
   gsub(/[()]/, " ", NOM);
 
   n = split(NOM, L);
   for (i=4; i<=n; i++) L[3] = L[3] (L[3] != "" ? " " : "" ) L[i];
 
   if (L[1] == 1) {
      L[1] = L[2];
      L[2] = L[3];
      gsub(/ /, "", L[2]);
   }
 
   L[2] = sprintf("%-30.30s", L[2]);
 
   getline;
   getline;
 
   COMP = $0;
   gsub(/[()]/, " ", COMP);
 
   n = split(COMP, M);
   for (i=4; i<=n; i++) M[3] = M[3] (M[3] != "" ? " " : "" ) M[i];
 
   M[2] = sprintf("%-8.8s", M[2]);
 
   if (M[2] > 0) {
     print L[2] " NOMBRE DE MSG : " M[2];
   }
   next;
}


Pour l'exécuter :

awk -f rexx.awk IN > OUT

Reply

Marsh Posté le 25-12-2007 à 18:35:28    

merci bcp  aigles

Reply

Sujets relatifs:

Leave a Replay

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