[BASH] Division par mille sans BC

Résolu/Fermé
Paullux_1er Messages postés 122 Date d'inscription vendredi 10 février 2017 Statut Membre Dernière intervention 28 janvier 2020 - Modifié le 8 nov. 2017 à 18:26
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 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.

1 réponse

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
9 nov. 2017 à 07:18
hello
est ce que awk, dc, perl sont installés ?
0
Paullux_1er Messages postés 122 Date d'inscription vendredi 10 février 2017 Statut Membre Dernière intervention 28 janvier 2020 1
Modifié le 9 nov. 2017 à 07:38
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
0
Paullux_1er Messages postés 122 Date d'inscription vendredi 10 février 2017 Statut Membre Dernière intervention 28 janvier 2020 1
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.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
26 févr. 2018 à 14:11
tout peut se faire dans awk, montre le fichier avant/après
0
Paullux_1er Messages postés 122 Date d'inscription vendredi 10 février 2017 Statut Membre Dernière intervention 28 janvier 2020 1
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.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
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
0