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. Ah merci fiddy... Ca a marché !!
    Je te remercie de ton aide. Et merci aussi a jipicy.

    Cordialement
    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. 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. 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
          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.
        2. 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 ;)
        3. 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
            ;-))
        4. 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.
        5. Contributeur
          Salut,
          Cela se fait en une ligne avec un pipe et une redirection en utilisant cat et awk.
          1. Modérateur
            Salut,

            On peut avoir un aperçu de ton script s'il te plaît ?