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.
A voir également:

10 réponses

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

On peut avoir un aperçu de ton script s'il te plaît ?
0
fiddy Messages postés 11069 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
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
fiddy Messages postés 11069 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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
<mode des chiffres et des lettres>
Pas mieux ;-)
</mode des chiffres et des lettres>
0
titi26 > fiddy Messages postés 11069 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
fiddy Messages postés 11069 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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
echo $one $two $min $max | awk '{print $1" "$2" "$1+$2}" "$3" "$4'
0
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896 > 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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
titi26
 
Merci en tout cas de ton aide. Je suis débutante alors voilà. Sa a du se voir. lol

Merci ;)
0
fiddy Messages postés 11069 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
titi26
 
Toujours pas..

Ca m'affiche toujours :
2,2 3 5

C'est pas grave. Merci de ton aide.
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
fiddy Messages postés 11069 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
titi26
 
Cela m'affiche

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

Cordialement
0