hi all
I have to read a long cvs file every 4 columns with decimal "3,45" numbers.
The 9th row in this cvs is the first line I need, so it I tail -n+9.
I use sed -e 's/,/./g' to get decimal values with . delimiter.
So far no problem.
Goal is to get two maximum negative forces in ranges 56-66 degrees and 33-55 degrees.
Just for better understanding:
one test case is a set of two direction (open and close)
open and close have both an value of angel in degrees and a value force in Newton.
Here is a table header of three test cases. The original csv file has thousands and around 340 rows of angel/force combinations.
;test no 3;;;;test no 2;;;;test no 1;;;;
;process open;;process close;process open;;process close;process open;;process close
;angel;force;angel;force;angel;force;angel;force;angel;force;angel;force
;68,09;8,88;0,4;0,6;68,27;8,46;0,21;0,7;68,27;8,8;0,21;0,64
;67,44;0,19;0,12;3,41;67,72;0,35;0,03;2,65;67,72;0,26;0,03;2,2
;66,62;1,5;0,05;0,73;67,08;0,37;0,24;0,05;66,89;0,28;0,24;0,38
;60,46;-4,39;4,65;0,92;60,46;-4,79;5,02;0,82;60,55;-4,65;5,2;0,92
.....
What I need to get working is the commented if-statement.
#!/bin/bash
csv=${1:-"/home/my/test.csv"}
val1_angel_high=66
val1_angel_low=56
val2_angel_high=55
val2_angel_low=33
no_cols=$(head -n 1 "${csv}" | awk -F";" '{ print NF}')
no_val_pairs=$((((no_cols--))/4))
while [ $no_cols -gt 1 ]; do
angelCollection_process_1=( $(tail -n+9 "${csv}" | cut -d ';' -f "$no_cols" | sed -e 's/,/./g') )
forceCollection_process_1=( $(tail -n+9 "${csv}" | cut -d ';' -f "$((no_cols+1))" | sed -e 's/,/./g') )
#printf "Process 1 - Angel: %s Force: %s\n" "${angelCollection_process_1[@]}" "${forceCollection_process_1[@]}"
position=0
max_force=0.0;
for t in "${angelCollection_process_1[@]}"; do
if (( $(bc <<< "$t <= $val1_angel_high") && $(bc <<< "$t >= $val1_angel_low") )); then
#echo $t : $max_force">"${forceCollection_process_1[$position]}; #works
force="${forceCollection_process_1[$position]}";
echo $max_force $force; #works
force2=$(bc <<< "$force*100");
echo $force2; # not working (standard_in) 1: illegal character: ^M
#if (( $(bc <<< "${forceCollection_process_1[$position]} < $max_force") )); then
# max_force="${forceCollection_process_1[$position]}";
#fi
fi
((position++))
done
echo $max_force
no_cols=$((no_cols-4))
done
Output when I disable force2
0.0 0.9
0.0 0.96
0.0 1.04
0.0 1.16
0.0 1.1
0.0 1
0.0 0.94
0.0 0.94
0.0 0.98
0.0 1.02
0.0 1
0.0 0.98
0.0 1.04
0.0 0.96
0.0 0.9
0.0 0.72
0.0 0.56
0.0 0.38
0.0 0.22
0.0 0.18
0.0 0.08
0.0 0.04
0.0 0
0.0 0.05
0.0 0.09
0.0 0.15
0.0 0.39
0.0 0.47
0.0 0.77
0.0 -1.21
0.0 -1.53
0.0 -2.71
0.0 -1.87
0.0 -1.75
0.0 -1.91
0.0 -2.03
0.0 -1.81
0.0 -1.71
0.0 -1.53
0.0 -1.55
0.0 -1.57
0.0 -1.45
0.0 -1.45
0.0 -1.49
0.0 -1.45
0.0 -1.53
0.0 -1.31
Hope you find a solution how I can use the value from array in bc.
Other solutions are also welcome. I try to use perl also, but I failed with reading csv every 4 columns.
Example of csv content: ; 000X ; 000Y ; 001X ; 001Y ; 002X ; 002Y - Pastebin.com