Valeurs réelles en Shell

Résolu
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. Modérateur
    Salut,

    On peut avoir un aperçu de ton script s'il te plaît ?
    1. Contributeur
      Salut,
      Cela se fait en une ligne avec un pipe et une redirection en utilisant cat et awk.
      1. 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
        1. Contributeur
          Sinon tu peux utiliser simplement :
          cat fichier.txt | awk '{print $1" "$2" "$1+$2}' > fichier.txt
        2. Modérateur
          @fiddy<mode des chiffres et des lettres>
          Pas mieux ;-)
          </mode des chiffres et des lettres>
        3. @fiddyJ'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 ?
        4. Contributeur
          @titi26J'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.
      2. Modérateur
        echo $one $two $min $max | awk '{print $1" "$2" "$1+$2}" "$3" "$4'
        1. 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.
        2. Modérateur
          @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
          ;-))
      3. 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 ?
        1. Merci en tout cas de ton aide. Je suis débutante alors voilà. Sa a du se voir. lol

          Merci ;)
      4. Contributeur
        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
        1. Toujours pas..

          Ca m'affiche toujours :
          2,2 3 5

          C'est pas grave. Merci de ton aide.
      5. Modérateur
        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
        ;-)
        1. Contributeur
          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
          1. Cela m'affiche

            > ./tab.sh fichier.txt
            ./tab.sh : line 79: echo 2,2 3 : commande introuvable
            2,2 + 3 =
            >
            1. Modérateur
              Avant de le mettre dans ton script, essaie déjà dans un shell en interactif voir si ça marche...
          2. Ah merci fiddy... Ca a marché !!
            Je te remercie de ton aide. Et merci aussi a jipicy.

            Cordialement