Menu

[BASH] Division par mille sans BC [Résolu]

Paullux_1er 103 Messages postés vendredi 10 février 2017Date d'inscription 7 mai 2018 Dernière intervention - 8 nov. 2017 à 18:22 - Dernière réponse : dubcek 17429 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 28 mai 2018 Dernière intervention
- 27 févr. 2018 à 07:34
Bonjour,

J'ai accès à un serveur linux en ssh, et j'ai un problème important, je dois traiter des données d'un csv vers un autre, hors bc n'est pas installé et ne peut pas l'être.

Et à un moment j'ai une division par mille, comment :
- premièrement avec sed modifier ma variable pour faire comme si on la multiplie par mille en déplaçant le point et éventuellement ajouter des zéros.
- deuxièmement avec let ajouter une valeur (je sais faire).
- troisièmement pour finir avec sed, il faut à nouveau déplacer le point comme une division par mille, et éventuellement enlever les zéros.

Pour être honnête j'ai un peu de mal avec sed.

Merci de votre aide, merci d'avance.

Afficher la suite 

Votre réponse

6 réponses

dubcek 17429 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 28 mai 2018 Dernière intervention - 9 nov. 2017 à 07:18
0
Merci
hello
est ce que awk, dc, perl sont installés ?
Paullux_1er 103 Messages postés vendredi 10 février 2017Date d'inscription 7 mai 2018 Dernière intervention - 9 nov. 2017 à 07:37
oui et en passant par awk j'ai trouvé une solution :

echo $ValTot";"$(awk -F ";" 'NR == 1 {print $3/1000}' temp2.csv) > csvtemp2.csv
ValTot=$(awk -F ";" 'NR == 1 {print $1+$2}' csvtemp2.csv)
rm csvtemp2.csv
Paullux_1er 103 Messages postés vendredi 10 février 2017Date d'inscription 7 mai 2018 Dernière intervention - 26 févr. 2018 à 13:36
En fait ce qui faut faire c'est :

1 - D'abord avec awk multiplier par mille la valeur $3 du fichier csv.

2 - Puis additionner à la nouvelle valeur $3 la valeur qu'il faut ajouter, directement dans le bash, car on a 2 entiers naturels, donc plus de problème de nombres décimaux qui eux nécessitent BC.

3 - Et finalement utiliser sed pour placer le séparateur en point : "." en laissant 3 chiffres après le point :
Somme=$(echo $Somme | sed 's/...$/.&/')

4 - Après il faut recréer le csv avec la nouvelle valeur.
dubcek 17429 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 28 mai 2018 Dernière intervention - 26 févr. 2018 à 14:11
tout peut se faire dans awk, montre le fichier avant/après
Paullux_1er 103 Messages postés vendredi 10 février 2017Date d'inscription 7 mai 2018 Dernière intervention - 26 févr. 2018 à 20:28
j'ai pas le fichier avec moi, mais en gros il ressemble à :

type de valeur 1, type de valeur 2, type de valeur 3, type de valeur 4, type de valeur 5
0,0,456789.123,0,0

auquel il faut ajouter un nombre mille fois plus petit de type 1234.

ce qui donne à la sortie :

type de valeur 1, type de valeur 2, type de valeur 3, type de valeur 4, type de valeur 5
0,0,456790.357,0

vois tu ce que je veux dire, et mon script marche bien depuis des mois.
dubcek 17429 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 28 mai 2018 Dernière intervention - 27 févr. 2018 à 07:34
comme ca ?
$ cat fichier
type de valeur 1, type de valeur 2, type de valeur 3, type de valeur 4, type de valeur 5
0,0,456789.123,0,0
$ awk 'BEGIN {FS=OFS=","} /^[0-9]/ {$3=sprintf("%.3f", $3+=1.234); print $0}' fichier
0,0,456790.357,0,0
Commenter la réponse de dubcek