Bitte solche Skripte - ich würde sagen bis zu ca. 100 Zeilen - nicht als Download/Anhang anbieten, sondern als Code einbetten, dass man es sieht:
| #Weg Kraft
0.0 0.0
25 186.5852134
40 250.3759729
65 615.0974208
|
Mit reinen Bashmitteln ist eine Lösung auch möglich, aber zugegeben ist sie nicht sehr elegant:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | #!/bin/bash
arr=($(< weg-kraft.txt))
for i in {2..7..2}
do
# echo -n ${arr[i]}" "
x2=${arr[i+2]}
x1=${arr[i]}
y2=${arr[i+3]}
y1=${arr[i+1]}
# echo -n $x1 $x2 $y1 $y2" "
xd=$((${x2/.*/}-${x1/.*/}))
yd=$((${y2/.*/}-${y1/.*/}))
m=$((100*yd/xd))
l=${#m}
echo ${m:0:-2}.${m:l-2:l}
done
echo
for i in 2 4 6
do
# echo "scale=5;(${arr[i+3]}-${arr[i+1]})/(${arr[i+2]}-${arr[i]})"
echo "scale=5;(${arr[i+3]}-${arr[i+1]})/(${arr[i+2]}-${arr[i]})" | bc
done
|
for i in {2..7..2} iteriert von 2 bis 7 in 2er-Schritten. Bei größeren Zahlbereichen ist diese Schreibweise angemessen, aber hier sind es ja nur 3 Werte, daher ist for i in 2 5 7 ebenso gut und billiger zu schreiben wie leichter zu verstehen.
Die Hilfsvariablen x1, x2, y1, y2 dienen der Lesbarkeit.
${x2/.*/} schneidet von x2 alles hinter dem Punkt ab. Die Frage ist, ob man sich derartige Ungenauigkeiten leisten kann. Analoges gilt für die 3 anderen Variablen selbstverständlich.
xd=$((foo-bar))
ist dann trivial zu verstehen, statt $((yd/xd))
habe ich 100*yd genommen, um 2 Nachkommastellen zu generieren.
l=${#m} ist die Länge der Variablen m, echo ${m:0:-2}.${m:l-2:l} nimmt alles von m ausser den letzten 2 Stellen, einen Punkt und dann die letzten 2 Stellen von m.
Darunter die Rechnung an bc weitergereicht:
| 7.44
4.26
14.60
7.46340
4.25271
14.58885
|
Man sieht, die Ergebnisse liegen nicht weit voneinander. Man könnte mit der Bash auch mit den 7 Nachkommastellen rechnen, wenn man die 0.0 geschickt verartztet und es ansonsten immer mit 7 Nachkommastellen zu tun hat - man würde einfach den . weglöschen, weil (a*10000-b*10000)/(c*10000-d*10000)
das gleiche ist wie (a-b)/(c-d)
- in der Frage steht übrigens fälschlich (a-b)/c - d
.