bonjour,

voilà, je suis débutant en bash. ceci est en fait mon 1er script. ça m'a pris quelques jours pour en arriver là (et quelques posts sur le forum).
le résultat fait exactement ce que je veux mais est incroyablement lent. mon pc n'est pas une bête de compét, mais à la vitesse où ça avance, il y en a pour plusieurs jours de calcul....
je me dis que je n'ai pas forcément choisi les solutions les plus rapides de calcul. mais pour l'instant, je n'en connais pas d'autres...
alors, ce serait sympa si quelqu'un pouvait me donner quelques pistes pour optimiser mon script
ce script fait des profils swath (sur une bande de 10km de large, on calcule l'altitude moyenne, les valeurs min et max; et ceci pour chaque point du profil (environ une valeur tous les 90mètres, sur un profil d'environ 350km de long)


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# definition du nom de sortie à partir des coordonnées de la coupe
separe1_name=$(echo $start_proj | awk -F "/" '{print $1}')
separe2_name=$(echo $start_proj | awk -F "/" '{print $2}')
separe3_name=$(echo $end_proj | awk -F "/" '{print $1}')
separe4_name=$(echo $end_proj | awk -F "/" '{print $2}')
name_output=$separe1_name"-"$separe2_name"-"$separe3_name"-"$separe4_name
 
>mean_$name_output.txt
>min_$name_output.txt
>max_$name_output.txt
 
mean_y=0
min_y=10000
max_y=0
compteur=0
 
while read pos val
do
 
x=$(printf "%.2f\n" $pos)       #on arrondit pos à 2 chiffres après la virgule
 
y=$(printf "%.2f\n" $val)       #on arrondit val à 2 chiffres après la virgule 
 
if [ $(echo "$y < 0.00" | bc) -eq 1 ]; then    #on élimine z négatif et NaN
y=0                                    #si le test est vrai (y<0),il renvoie 1 
fi                                             #on remplace y par 0

# du à l'effet combiné de l'arrondi des valeurs (par printf) issues de gmt_project, des valeurs correspondant à la même ligne de SRTM sont quelquefois espacées de 0.01. on fait donc un test: si seulement l'écart est supérieur à 0.01, on considère qu'on est passé à une nouvelle ligne de données)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
diff=$(echo "$x-$i" | bc)
 
    if [ $(echo "$diff <= 0.01" | bc) -eq 1 ]
        then mean_y=$(echo "$mean_y+$y" | bc)
        ((compteur = $compteur + 1))
        if [ $(echo "$y < $min_y" | bc) -eq 1 ]; then
        min_y=$y
        fi
        if [ $(echo "$y > $max_y" | bc) -eq 1 ]; then
        max_y=$y
        fi
    else
        mean_y=$(echo "$mean_y/$compteur" | bc)
        echo $i $mean_y >> mean_$name_output.txt
echo position:$i moyenne:$mean_y min:$min_y max:$max_y compteur:$compteur
        echo $i $min_y >> min_$name_output.txt
        echo $i $max_y >> max_$name_output.txt
 
                i=$x                        # on change la valeur de i
        mean_y=$y
        max_y=$y
        min_y=$y
        compteur=1
    fi
 
done < $fich

merci d'avance,
seb