Valeurs réelles en Shell

Résolu
titi26 -  
 titi26 -
Bonjour tout le monde,

Jai besoin de votre aide... En effet, j'aimerai savoir comment l'on peut faire pour pouvoir la somme de valeurs réelle, c'est à dire, des nombres à virgules (flottant).. Avez vous une idée ?

En fait, je doit faire appel a un fichier .txt qui possède deux colonnes de chiffre, et je dois additionner chaque ligne. Mais une contrainte a été posé : accepter les valeurs à virgule.

ex :
--- fichier.txt ---
2 3
5 6
7 8
4 5

En sortie, j'obtiendrai :
--- fichier.txt ---
2 3 5
5 6 11
7 8 15
4 5 9

Imaginon que je mette un chiffre a virgule, j'obtiendrai :
--- fichier.txt ---
2,2 3 5,2
5 6 11
7 8 15
4 5 9

J'espère avoir été assez clair... J'ai fait plein de recherche sur des bouquins mais rien na m'a aidé. Ce qui me bloque c'est qu'il doit faire appel à un fichier. Et je ne peux donc pas caster des variables en tant que flottant.
Configuration: Windows XP
Internet Explorer 6.0

10 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    On peut avoir un aperçu de ton script s'il te plaît ?
    0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut,
    Cela se fait en une ligne avec un pipe et une redirection en utilisant cat et awk.
    0
  3. titi26
     
    Oui voilà...

    Ceci est le script que je dois modifier.

    #!/bin/bash
    # On verifie si le fichier existe
    if [ $# -lt 1 ]
    then
    echo "Il faut donner un nom de fichier en argument"
    exit
    fi
    if !(test -f $1)
    then
    echo "Fichier $1 inconnu !"
    exit
    fi
    # on efface l'ecran
    tput clear
    # on commence par faire une premiere passe pour
    # isoler le max et le min. On suppose que l'entree
    # est constituee d'entiers strictement positifs.
    min=0
    max=0
    i=0
    echo "------Fichier en entree: $1-------------"
    cat < $1 | while true
    do
    read ligne
    # traiter la ligne
    if [ "$ligne" = "" ]; then break; fi
    one=`echo $ligne | cut -d " " -f 1`
    two=`echo $ligne | cut -d " " -f 2`
    if [ $i -eq 0 ] #### Expliquez
    then
    max=$two
    min=$one
    i=$((i+12)) #### Expliquez
    fi
    if [ $one -gt $max ]
    then
    max=$one
    fi
    if [ $two -gt $max ]
    then
    max=$two
    fi
    if [ $one -lt $min ]
    then
    min=$one
    fi
    if [ $two -lt $min ]
    then
    min=$two
    fi
    # on ecrit le max et le min dans un fichier
    echo "$max $min" > /tmp/bidon
    done
    # On effectue la deuxieme passe
    # on commence par recuperer le max et le min
    max=`cat /tmp/bidon |cut -d " " -f 1`
    min=`cat /tmp/bidon |cut -d " " -f 2`
    # on reprend
    cat < $1 | while true
    do
    read ligne
    # traiter la ligne
    if [ "$ligne" = "" ]; then break; fi
    one=`echo $ligne | cut -d " " -f 1`
    two=`echo $ligne | cut -d " " -f 2`
    echo $one $two $((two+one)) $min $max
    done
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Sinon tu peux utiliser simplement :
      cat fichier.txt | awk '{print $1" "$2" "$1+$2}' > fichier.txt
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        <mode des chiffres et des lettres>
        Pas mieux ;-)
        </mode des chiffres et des lettres>
        0
      2. titi26 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        J'ai essayé mais cela m'affiche rien.

        Ce que je comprend pas dans ta ligne c'est que $1 et $2 ne peuvent pas marcher étant donné que les nombres à additionner sont dans le fichier.txt en question. Ne peut on pas caster la variable one et two ?
        0
      3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > titi26
         
        J'ai essayé mais cela m'affiche rien.
        Normal que cela n'affiche rien. La commande que je t'ai donné modifie fichier.txt. Affiche ton fichier avec cat fichier.txt, et normalement il y aura une colonne supplémentaire valant la somme des deux précédentes.

        Ce que je comprend pas dans ta ligne c'est que $1 et $2 ne peuvent pas marcher étant donné que les nombres à additionner sont dans le fichier.txt en question.
        Ben si justement ^^. le cat | awk redirige la sortie de cat sur l'entrée de awk. Les variables $1 et $2 se retrouvent donc automatiquement changées.
        0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    echo $one $two $min $max | awk '{print $1" "$2" "$1+$2}" "$3" "$4'
    0
    1. titi26
       
      J'ai bien fait comme ce que tu as dit.. Mais cela ne m'affiche pas la somme avec les flottants. Par exemple, j'ai mis en 1ère ligne de fichier.txt : 2,2 3
      Et cela me donne toujours 5 et non 5,2.

      Je ne vois pas de solution pour pouvoir lui faire faire l'addition des nombres flottants.
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > titi26
         
        jp@MDK:~/tmpfs ssh$ echo ${one} ${two}
        3,2 5
        
        jp@MDK:~/tmpfs ssh$ echo ${one} ${two} |awk '{print $1" "$2" "$1+$2}'
        3,2 5 8,2
        ;-))
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. titi26
     
    Ah ouai ?! Ceci marche bien chez toi ?! C'est bizar parce que chez moi, cela ne marche pas du tout... Ca m'affiche toujours :
    2,2 3 5

    Voila mon bout de code modifié :

    if [ "$ligne" = "" ]; then break; fi
    one=`echo $ligne | cut -d " " -f 1`
    two=`echo $ligne | cut -d " " -f 2`
    echo ${one} ${two} | awk '{print $1" "$2" "$1+$2}'
    done


    Quan je l'exécute :
    > ./tab.sh fichier.txt
    2,2 3 5
    1 5 6
    2 8 10
    >

    Je comprend pas... peut-être que je n'ai pas tout les packages ?
    0
    1. titi26
       
      Merci en tout cas de ton aide. Je suis débutante alors voilà. Sa a du se voir. lol

      Merci ;)
      0
  7. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Si tu veux que cela s'affiche sur l'écran, tu fais simplement :
    cat fichier.txt | awk '{print $1" "$2" "$1+$2}'


    Si tu veux que cela modifie ton fichier sans que cela s'affiche sur l'écran :
    cat fichier.txt | awk '{print $1" "$2" "$1+$2}' > fichier.txt
    0
    1. titi26
       
      Toujours pas..

      Ca m'affiche toujours :
      2,2 3 5

      C'est pas grave. Merci de ton aide.
      0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    C'est un peu tiré par les cheveux, mais tu peux essayer ça :
    one=3,2;two=5
    
    echo ${one} + ${two} = $(echo "${one/,/.} + ${two/,/.}" | bc | tr '.' ',')
    3,2 + 5 = 8,2
    ;-)
    0
  9. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Ah, j'avais même pas vu. Cela est dû à cause de la virgule décimale au lieu du point décimal.

    cat fich.txt | tr ',' '.' | awk '{print $1" "$2" "$1+$2}' | tr '.' ','


    Cdlt
    0
  10. titi26
     
    Cela m'affiche

    > ./tab.sh fichier.txt
    ./tab.sh : line 79: echo 2,2 3 : commande introuvable
    2,2 + 3 =
    >
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Avant de le mettre dans ton script, essaie déjà dans un shell en interactif voir si ça marche...
      0
  11. titi26
     
    Ah merci fiddy... Ca a marché !!
    Je te remercie de ton aide. Et merci aussi a jipicy.

    Cordialement
    0