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

Shell et commandes GNU Discussion :

un problème sur awk


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut un problème sur awk
    Bonjour,

    J'ai besoin de manipuler des chiffres dans un fichier .tem et de les transférer dans un fichier .out.

    Mon problème est que je n'arrive pas à obtenir le bon résultat après un calcul de division avec les chiffres qui sont présents dans le fichier .tem.

    Par exemple, je divise 1.2022222 par 100, ça donne 0. J'ai testé même avec2.403126079 +1, ça donne 3 au lieu de 3.403126079.

    Merci d'avance pour votre aide.

    Clement

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    c'est pas la bonne solution.

    La bonne solution est de calculer directement en décimale par exemple avec dc pour empêcher toute création d'un entier absolu (qui ne peut pas devenir un décimal)

    exemple
    4.320001 dans un fichier texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ~:$ echo "9k "$(cat fichier)" 3.43 + pq" | dc
    7.750001
    ~:$
    ce qui évitera d'avoir à faire un travail post-traitement qui sera pourquoi pas source d'erreurs potentielles supplémentaire...
    autant travailler depuis le départ en décimal.

  3. #3
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Suite au Message privé un exemple complêt avec awk pour traiter le fichier :

    voilà la solution avec un exemple concret

    il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "9k "$(commande_sortie_donnée)" 100 / " | dc > outpout
    9k c'est juste le niveau de précision (nombre de décimales)
    de plus dc utilise la notation mathématique RPN.

    donc pour un fichier qui à par exemple
    ça devient pour une division par 100 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ~:$ cat > fichier
    a E 30 t 350 r
    ^D
    ~:$ echo "9k "$(awk '{print $5}' fichier)" 100 / pq" > output
    ~:$ cat output
    3.500000000
    ~:$ rm output fichier

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut awk
    J'ai créé un .awk à faire l’extraction Extrat.awk et un batch, le code dans le batch est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    gawk -f ..\Extrat.awk -v outfile=..\ex.out    ..\\ex.tmp
     
    echo "9k "$(awk '{print $16}')" 100 / " | dc > outfile outfile=..\\resultat.out   ..\\ex.out
     
    rm ..\\ resultat.out
    rm ..\\ex.tmp
    Mais le batch ne marche pas, est-ce qu'il y a une erreur de syntaxe dans le batch ?


    Clement

  5. #5
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par debutanta Voir le message
    J'ai créé un .awk à faire l’extraction Extrat.awk et un batch, le code dans le batch est :

    Mais le batch ne marche pas, est-ce qu'il y a une erreur de syntaxe dans le batch ?


    Clement
    Y'a que ça des erreurs dans le batch....

    Comme je te l'ai déjà dit dans les messages privés, je répète :

    un batch à forcément un interpréteur en entête tu n'en as pas.
    tes chemins sont tous faux "\" un chemin unix ne contient jamais de "\"
    tu déclares des choses après leur usage... c'est impossible.
    tu aurais au moins pu prendre 30 secondes pour regarder un exemple avant de te lancer parce que là tu aurai vu toi même que ça allait pas avant même de tenter de lancer le script

    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
     
    #!/bin/sh
    EX=/chemin/reel/ailleurs_possible/ex.tmp
    outfile=/chemin/quelque/part/fichier
    # debut du code
    # extraction
    gawk -f /chemin/reel/vers/Extrat.awk -v $output $EX
    if [ $? -ne 0 ]; then echo "erreur dans la commande : gawk -f /chemin/reel/vers/Extrat.awk -v $output $EX " 
    exit 1
    fi 
    # calcul
    echo "9k "$(awk '{print $16}')" 100 / " | dc > $outfile 
    if [ $? -ne 0 ]; then echo "erreur dans la commande : echo \"9k \"$(awk '{print $16}')\" 100 / \" | dc > $outfile"
    exit 2
    fi
    # purge du fichier EX
    rm $EX
    if [ $? -ne 0 ] ; then echo "erreur lors de l effacement de $EX"
    exit 3
    fi
    exit 0
    à minima quelque chose comme ça...
    et encore là c'est pas propre je supprime pas le fichier output si le calcul échoue...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut awk
    Citation Envoyé par frp31 Voir le message
    Y'a que ça des erreurs dans le batch....

    Comme je te l'ai déjà dit dans les messages privés, je répète :

    un batch à forcément un interpréteur en entête tu n'en as pas.
    tes chemins sont tous faux "\" un chemin unix ne contient jamais de "\"
    tu déclares des choses après leur usage... c'est impossible.
    tu aurais au moins pu prendre 30 secondes pour regarder un exemple avant de te lancer parce que là tu aurai vu toi même que ça allait pas avant même de tenter de lancer le script

    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
     
    #!/bin/sh
    EX=/chemin/reel/ailleurs_possible/ex.tmp
    outfile=/chemin/quelque/part/fichier
    # debut du code
    # extraction
    gawk -f /chemin/reel/vers/Extrat.awk -v $output $EX
    if [ $? -ne 0 ]; then echo "erreur dans la commande : gawk -f /chemin/reel/vers/Extrat.awk -v $output $EX " 
    exit 1
    fi 
    # calcul
    echo "9k "$(awk '{print $16}')" 100 / " | dc > $outfile 
    if [ $? -ne 0 ]; then echo "erreur dans la commande : echo \"9k \"$(awk '{print $16}')\" 100 / \" | dc > $outfile"
    exit 2
    fi
    # purge du fichier EX
    rm $EX
    if [ $? -ne 0 ] ; then echo "erreur lors de l effacement de $EX"
    exit 3
    fi
    exit 0
    à minima quelque chose comme ça...
    et encore là c'est pas propre je supprime pas le fichier output si le calcul échoue...
    En effet, j'ai oublié de te dire que je travaille sous windows, "\" est ok pour indiquer un chemin.
    # la partie d’extraction .awk marche bien, je voudrais faire des calculs décimaux sur une colonne du fichier out en gardant les restes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set output=..\\msci\\archive\\%startdate%_%fileIn%_security.out
     
     
    echo "9k "$(awk '{print $16}')" 100 / " | dc > %output%
    J'ai fait des recherches dans d'autres forums, il y a des gens disant que le batch ne sait pas gérer les calculs décimaux. J

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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