IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

traitement shell UNIX


Sujet :

Linux

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Par défaut traitement shell UNIX
    Bonjour,


    le but c'est de transformer les valeurs numériques qui se trouvent entre () et précédé par la chaine de caractère COMP-3 en valeur y.

    la valeur de y est calculée à partir de cette
    y=n+1/2
    n: valeur numérique entre (n)
    y: valeur numérique

    Ci-dessous un extrait de mon fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    RE5-HDATEVN-01 COMP-3 9(8)     
    RE5-HTYPEVN-01 COMP 9(4)       
    RE5-HSEQEVN-01 COMP 9(4)       
    RE5-HDEXEVN-01 COMP-3 9(8)     
    RE5-HCEXEVN-01  CHAR(2)        
    RE5-HDFIEVN-01 COMP-3 9(8)     
    RE5-HCFIEVN-01  CHAR(2)        
    RE5-HFILMON-01 COMP-3 S9(11)   
    RE5-HFILMON-02 COMP-3 S9(11)   
    RE5-HFILMON-03 COMP-3 S9(11)   
    RE5-HFILMON-04 COMP-3 S9(11)   
    RE5-HFILMON-05 COMP-3 S9(11)   
    RE5-HFILMON-06 COMP-3 S9(11)   
    RE5-HFILMON-07 COMP-3 S9(11)   
    RE5-HFILMON-08 COMP-3 S9(11)   
    RE5-HFILMON-09 COMP-3 S9(11)
    exemple je prend la dernière ligne : y=11+1/2 ça donne 6
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RE5-HFILMON-09 COMP-3 S9(11)
    resultat: RE5-HFILMON-09 COMP-3 S9(6)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/COMP-3 9(8)/COMP-3 9(4)/g"
    j'arrive pas à paramétrer cette formule dans le script pour modifier directement mon fichier.


    Merci

  2. #2
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Avec sed, pas facile

    Un début avec awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    awk -F" " '
    {
    	if ($2 != "COMP-3") {
    		print $0
    		next
    	}
    	if ($3 !~ /^S9\(/) {
    		print $0
    		next
    	}
    	match($3,/\)/)
    	Longueur=RSTART-4
    	Valeur=substr($3,4,Longueur)
    	if (Valeur !~ /[0-9]+/) {
    		print "Enreg "NF" : Valeur ("Valeur") non numerique !" | "cat 1>&2"
    		print $0
    		next
    	}
    	NouvelleValeur=(Valeur+1)/2
    	$3="S9("NouvelleValeur""substr($3,RSTART)
    	print $0
    } ' Fic > result.txt
     
    echo -e "Fin Traitement\n"
    echo -e "result.txt\n=========="
    cat result.txt


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Fic
    ====
    RE5-HDATEVN-01 COMP-3 9(8)     
    RE5-HTYPEVN-01 COMP 9(4)       
    RE5-HSEQEVN-01 COMP 9(4)       
    RE5-HDEXEVN-01 COMP-3 9(8)     
    RE5-HCEXEVN-01  CHAR(2)        
    RE5-HDFIEVN-01 COMP-3 9(8)     
    RE5-HCFIEVN-01  CHAR(2)        
    RE5-HFILMON-01 COMP-3 S9(11)   
    RE5-HFILMON-02 COMP-3 S9(11)   
    RE5-HFILMON-03 COMP-3 S9(11)   
    RE5-HFILMON-04 COMP-3 S9(11)   
    RE5-HFILMON-05 COMP-3 S9(11)   
    RE5-HFILMON-06 COMP-3 S9(11)   
    RE5-HFILMON-07 COMP-3 S9(11)   
    RE5-HFILMON-08 COMP-3 S9(11)   
    RE5-HFILMON-09 COMP-3 S9(11)
     
    Traitement : 
    Fin Traitement
     
    result.txt
    ==========
    RE5-HDATEVN-01 COMP-3 9(8)     
    RE5-HTYPEVN-01 COMP 9(4)       
    RE5-HSEQEVN-01 COMP 9(4)       
    RE5-HDEXEVN-01 COMP-3 9(8)     
    RE5-HCEXEVN-01  CHAR(2)        
    RE5-HDFIEVN-01 COMP-3 9(8)     
    RE5-HCFIEVN-01  CHAR(2)        
    RE5-HFILMON-01 COMP-3 S9(6)
    RE5-HFILMON-02 COMP-3 S9(6)
    RE5-HFILMON-03 COMP-3 S9(6)
    RE5-HFILMON-04 COMP-3 S9(6)
    RE5-HFILMON-05 COMP-3 S9(6)
    RE5-HFILMON-06 COMP-3 S9(6)
    RE5-HFILMON-07 COMP-3 S9(6)
    RE5-HFILMON-08 COMP-3 S9(6)
    RE5-HFILMON-09 COMP-3 S9(6)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Bonjour,

    j'ai pondu une solution avec sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cp file.txt file.tmp # sauvegarde du fichier initial
    
    for line in `seq $(cat file.txt | wc -l)`   # je récupère le nombre de ligne du fichier
    do
    
    # je prends la valeur entre parenthèses et j'applique la division :
    let newval=(` sed -e $line'!d' operation.txt | cut -f2 -d'(' | cut -f1 -d')'`+1)/2 
    # je modifie la ligne traitée si elle contient 'COMP-3':
    sed -i $line{"/COMP-3/s/\(.*\)(\(.*\))/\1(${newval})/"} file.txt 
    
    done
    Attention la commande wc ne prend pas en compte la dernière ligne du fichier si celle-ci n'est pas terminée par un caractère de fin de ligne. Il faut donc s'en assurer avant, ou le rajouter (avec sed je pense que c'est faisable). Cela rajouterait une ligne avant la boucle (à moins qu'il y ait une autre solution).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    RE5-HDATEVN-01 COMP-3 9(4)     
    RE5-HTYPEVN-01 COMP 9(4)       
    RE5-HSEQEVN-01 COMP 9(4)       
    RE5-HDEXEVN-01 COMP-3 9(4)     
    RE5-HCEXEVN-01  CHAR(2)        
    RE5-HDFIEVN-01 COMP-3 9(4)     
    RE5-HCFIEVN-01  CHAR(2)        
    RE5-HFILMON-01 COMP-3 S9(6)   
    RE5-HFILMON-02 COMP-3 S9(6)   
    RE5-HFILMON-03 COMP-3 S9(6)   
    RE5-HFILMON-04 COMP-3 S9(6)   
    RE5-HFILMON-05 COMP-3 S9(6)   
    RE5-HFILMON-06 COMP-3 S9(6)   
    RE5-HFILMON-07 COMP-3 S9(6)   
    RE5-HFILMON-08 COMP-3 S9(6)   
    RE5-HFILMON-09 COMP-3 S9(6)

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Au fait, BlaireauOne, il me semble que les lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    RE5-HDATEVN-01 COMP-3 9(8)     
    RE5-HDEXEVN-01 COMP-3 9(8)     
    RE5-HDFIEVN-01 COMP-3 9(8)
    devraient être modifiée aussi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    RE5-HDATEVN-01 COMP-3 9(4)     
    RE5-HDEXEVN-01 COMP-3 9(4)     
    RE5-HDFIEVN-01 COMP-3 9(4)
    à moins que je n'ai pas compris ce que tu veux faire, Melmouj.

  5. #5
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Citation Envoyé par To-Ma Voir le message
    Au fait, BlaireauOne, il me semble que les lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RE5-HDATEVN-01 COMP-3 9(8)     
    .../...
    devraient être modifiée aussi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RE5-HDATEVN-01 COMP-3 9(4)     
    .../...
    C'est exact, d'où ma phrase ==> Un début avec awk

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par melmouj Voir le message
    Bonjour,


    le but c'est de transformer les valeurs numériques qui se trouvent entre () et précédé par la chaine de caractère COMP-3 en valeur y.

    la valeur de y est calculée à partir de cette
    y=n+1/2
    n: valeur numérique entre (n)
    y: valeur numérique

    Ci-dessous un extrait de mon fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    RE5-HDATEVN-01 COMP-3 9(8)     
    RE5-HTYPEVN-01 COMP 9(4)       
    RE5-HSEQEVN-01 COMP 9(4)       
    RE5-HDEXEVN-01 COMP-3 9(8)     
    RE5-HCEXEVN-01  CHAR(2)        
    RE5-HDFIEVN-01 COMP-3 9(8)     
    RE5-HCFIEVN-01  CHAR(2)        
    RE5-HFILMON-01 COMP-3 S9(11)   
    RE5-HFILMON-02 COMP-3 S9(11)   
    RE5-HFILMON-03 COMP-3 S9(11)   
    RE5-HFILMON-04 COMP-3 S9(11)   
    RE5-HFILMON-05 COMP-3 S9(11)   
    RE5-HFILMON-06 COMP-3 S9(11)   
    RE5-HFILMON-07 COMP-3 S9(11)   
    RE5-HFILMON-08 COMP-3 S9(11)   
    RE5-HFILMON-09 COMP-3 S9(11)
    exemple je prend la dernière ligne : y=11+1/2 ça donne 6
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RE5-HFILMON-09 COMP-3 S9(11)
    resultat: RE5-HFILMON-09 COMP-3 S9(6)
    11 + 1/2 chez-moi ça donne 11,5 en calcul réel et 11 en calcul entier. A moins que tu ne veuilles parler de (11 + 1) / 2 !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/bin/sh
    exec 3<ficEntree
    exec 4>ficResult
     
    while read lig 0<&3
    do
        echo "$lig" |grep "COMP-3" 1>/dev/null
        if test $? -ne 0
        then
             echo "$lig" 1>&4
             continue
        fi
     
        deb=`echo $lig |cut -f1 -d\(`
        nb=`echo $lig |cut -f2 -d\( |sed -e "s/)//"`
        res=`expr \( $nb + 1 \) / 2`
     
        echo "$deb($res)" 1>&4
    done
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Lancement d'un shell Unix dans un proc stockée
    Par SBA03 dans le forum Oracle
    Réponses: 20
    Dernier message: 31/08/2006, 09h22
  2. Réponses: 1
    Dernier message: 24/04/2006, 18h03
  3. Script SHELL/UNIX avec mysql
    Par HacHHacH dans le forum Linux
    Réponses: 6
    Dernier message: 06/04/2006, 23h48
  4. CODE RETOUR GENERE PAR PL/SQL POUR SHELL UNIX
    Par mimi_été dans le forum PL/SQL
    Réponses: 6
    Dernier message: 18/11/2004, 08h32
  5. Lancer des shell unix pour creation d'objet ORACLE
    Par sygale dans le forum Administration
    Réponses: 6
    Dernier message: 27/10/2004, 18h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo