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 :

[CSH] Trouver l'ordre de grandeur d'une variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut [CSH] Trouver l'ordre de grandeur d'une variable
    Bonjour,

    Afin de faire des multiplots en boucle, j'essaye d'automatiser certaines commandes d'un programme SIG (gmt). Pour ce faire, j'aurais besoin en CSH de sortir l'ordre de grandeur de variables:

    ex:

    j'aimerais sortir: j'aimerais avoir: etc...

    Trouve pas trop d'aide sur le net..

    merci.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Avec sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "x=1.51588412525e-14\nx=2.845556655e09" | sed 's:^.*\(e-\{0,1\}[0-9]\{1,\}\)$:1\1:'
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    mais pourquoi csh ?!
    personne n'utilise csh !
    c'est archaïque.
    c'est pas maniable.
    ça colle aux doigts.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    il semblerait qu'on puisse s'en sortir en changeant le point pour une virgule et en transitant par printf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ printf "%.0e\n" `echo "1.51588412525e-14" | tr . ,`
    2e-14
    $ printf "%.0e\n" `echo "2.845556655e09" | tr . ,`
    3e+09
    ou encore Perl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "1.51588412525e-14" | perl -ne 'printf "%.0e\n", $_'
    2e-14
    $ echo "2.845556655e09" | perl -ne 'printf "%.0e\n", $_'
    3e+09
    edit : en fait de point ou de virgule c'est même plutôt une question de locale ($LC_NUMERIC)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ LANG=C printf "%.0e\n" "2.845556655e09"
    3e+09

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Avec sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "x=1.51588412525e-14\nx=2.845556655e09" | sed 's:^.*\(e-\{0,1\}[0-9]\{1,\}\)$:1\1:'
    super merci

    mais j'ai du mal à bien formuler la commande sed dans mon cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed [-n] [-e commande] [-f fichier de commandes] [fichier]
    J'ai une variable de la forme: $z[1] dont je veux tirer son ordre de grandeur dans $MO

    j'essaye des trucs au pif:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $z[1] sed 's:^.*\(e-\{0,1\}[0-9]\{1,\}\)$:1\1:' $MO
    mais rien ne marche


    Merci pour toute aide

    PS: si j'utilise CSH au lieu des B shell c'est uniquement car j'interviens sur des programmes déjà créés.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Avec un shell POSIX, j'écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MO=`echo $z[1] | sed 's:^.*\(e-\{0,1\}[0-9]\{1,\}\)$:1\1:'`
    Avec bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MO=$(sed 's:^.*\(e-\{0,1\}[0-9]\{1,\}\)$:1\1:' <<< $z[1])
    csh, je ne maîtrise pas.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut
    @ BufferBob

    CSH ne trouve pas la commande $ ..


    @ al1_24

    Les deux commandes ne semblent pas fonctionner en CSH effectivement ..

    pas moyen avec awk ?

  8. #8
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Newenda Voir le message
    CSH ne trouve pas la commande $ ..
    normal, c'est le prompt

    edit: avec awk ça marche aussi effectivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "2.845556655e09" | awk '{printf("%.0e\n", $1)}'
    3e+09

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 361
    Par défaut
    Bonjour,

    Peut-être un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set MO=`echo $z[1] | sed -e 's/[0-9.]*/1/'`

  10. #10
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "scale=1;l(2.845556655e09) / l(10)" | sed -r 's/([0-9])e([0-9])/\1*10^\2/' | bc -l
    9.4
    c'est l'ordre de grandeur.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    il semblerait qu'on puisse s'en sortir en changeant le point pour une virgule et en transitant par printf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ printf "%.0e\n" `echo "1.51588412525e-14" | tr . ,`
    2e-14
    $ printf "%.0e\n" `echo "2.845556655e09" | tr . ,`
    3e+09
    Attention! Les spécifications indiquent clairement que le résultat attendu est 1e-14 (et non 2e-14) et 1e+09 (et non 3e+09).

    Je plussoie donc la réponse de disedorgue pour csh:
    Citation Envoyé par disedorgue Voir le message
    Peut-être un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set MO=`echo $z[1] | sed -e 's/[0-9.]*/1/'`

  12. #12
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    le résultat attendu est 1e-14 (et non 2e-14) et 1e+09 (et non 3e+09).
    Je plussoie donc la réponse de disedorgue pour csh:
    effectivement, bien vu (ou c'est moi qui vois moyen bien possiblement aussi )

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut
    Merci à vous, toutes vos réponses m'ont appris un truc en plus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ordre de grandeur d'une BDD
    Par eprevot dans le forum MySQL
    Réponses: 15
    Dernier message: 04/11/2011, 10h08
  2. format ordre des modalités d'une variable
    Par eamoros dans le forum SAS Base
    Réponses: 2
    Dernier message: 10/02/2009, 18h25
  3. Ordre de grandeur d'une fonction
    Par Bool1988 dans le forum Caml
    Réponses: 7
    Dernier message: 05/09/2007, 15h38
  4. Trouver le type d'une variable
    Par Melvine dans le forum Linux
    Réponses: 16
    Dernier message: 07/06/2006, 09h59
  5. [langage] trouver une variable dans une autre
    Par BEAUJAULT dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2004, 15h04

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