C'est un exemple. Dans un vrai code, le truc est intégré dans une fonction à laquelle on passe le groupe demandé et qu'on renvoie ensuite au grep.
Version imprimable
bref merci j'apprends bcp
Que c'est compliqué. La totalité du script tient en une ligne de deux "sort". Nul besoin de fonction, de grep, de boucle, etc.Citation:
C'est un exemple. Dans un vrai code, le truc est intégré dans une fonction à laquelle on passe le groupe demandé et qu'on renvoie ensuite au grep.
Alors comme je l'ai dit il y a deux posts de ça, le grep c'est pour remplacer le premier sort. Donc le grep ne vient pas en plus mais à la place => deux commandes dans le code d'origine, toujours deux commandes dans le code de remplacement. Et (malheureusement en contradiction avec ce que dit disedorgue), je pense que grep |sort est plus rapide que sort |sort puisque le grep retourne moins de lignes que ce qu'il y en a à l'origine (enfin au pire il en retourne autant mais quoi qu'il en soit, ne perd pas de temps à les trier).
Concernant les boucles, N_BaH, lui, parlait de le faire en bash pur, ce qui semble-t-il est imposé. Donc là plus de grep/sort ou autre programme externe à bash qui ferait tout le boulot. Il faut lire les datas et les examiner une à une => une boucle donc.
Et la fonction c'est un réflexe généraliste de dev. On me demande un truc je mets le truc dans une fonction sans tenir compte de la difficulté de codage dudit truc. C'est un principe. Ca permet de rendre le programme plus modulable, pérenne et évolutif. C'est conseillé dans tous les bouquins de progammation structurée (comme quand on dit qu'en C on ne code pas dans le main).
J'ai surtout découvert l'énorme avantage de cette façon de faire avec Python. Parce qu'un script Python possède l'énorme avantage de pouvoir tourner de façon indépendante ou bien d'être intégré (importé) dans un programme plus vaste sans avoir à être modifié. A condition toutefois d'avoir prévu le truc et d'avoir intégré tout le travail à faire dans une fonction.
Ainsi en Python, ce travail serait codé ainsi
Si le script est exécuté directement, la variable "__name__" vaut "__main__" et le code du "if" est exécuté, ce qui permet à l'utilisateur de rentrer le nom du fichier à traiter pour avoir le résultat ; et si le script est importé la variable "__name__" ne vaut pas "__main__" (en fait elle vaut le nom du script) donc le "if" ne s'exécute pas mais la fonction faisant le job est quand-même utilisable par celui qui fait l'import. Ce sera simplement à lui de faire saisir le nom du fichier et afficher le résultat par ses propres moyens (IHM, mail, imprimante, ...) => modularitéCode:
1
2
3
4
5
6
7
8 def minValue(fic): ... (recherche de la valeur la plus basse dans le fichier "fic")... return result # minValue() if __name__ == "__main__": print(minValue(input("Fichier à traiter:"))) # if
Le bash n'est pas aussi sympa à ce sujet mais qu'importe, ce n'est pas parce qu'un travail est facile à faire qu'il faut négliger les bonnes habitudes.
Et si demain on me dit "non, pas de grep/sort, il faut du bash pur" ben je modifie juste la fonction => évolutivité.Code:
1
2
3
4
5
6
7
8 #!/bin/bash minValue() { grep "^$2 " "$1" | sort -nk2 | head -n 1 } for g in $(seq 10); do # Imaginons qu'il y ait 10 groupes... minValue "/tmp/xx.txt" $g done
ré-écrit ma fonction compare qui était bien fausse (si négatif, pour les décimales if faut alors inverser la comparaison/ ou mettre en négatif aussi les décimales )
Code:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 cmp_values() { readarray -d '.' -t a <<< "$1" readarray -d '.' -t b <<< "$2" [ ${a[0]} -gt ${b[0]} ] && { echo 1; return; } [ ${a[0]} -lt ${b[0]} ] && { echo "-1"; return; } adec=${a[1]} bdec=${b[1]} if [ "${a:0:1}" = "-" ]; then # on inverse le sens si nombres négatifs adec=${b[1]} bdec=${a[1]} fi [ ${adec:-0} -gt ${bdec:-0} ] && { echo 1; return; } [ ${adec:-0} -lt ${bdec:-0} ] && { echo "-1"; return; } echo 0 } readgroups() { declare -A groups declare mini=99999999 # calcul + petite valeur pour chaque groupe while read -r group value name; do [ "${group:0:1}" = "#" ] && continue value=${value/,/'.'} mini=9999999 [ ${groups[$group]+_} ] && mini=${groups[$group]} [ $(cmp_values "$mini" "$value") == "1" ] && groups["$group"]="$value" done < "$1" #affiche resultats en relisant le fichier (pas optimal) while read -r group value name; do [ "${group:0:1}" = "#" ] && { echo "$group $value $name" continue } valuetmp=${value/,/'.'} #on restitue obligatoirement le bon format if [ "$valuenew" == "${groups[$group]}" ]; then echo -e "$group $value $name \t #MINI" else echo "$group $value $name" # pour debug uniquement fi done < "$1" } readgroups "test.txt"
Merci à vous deux.
Je pense aussi.
Juste que ça aurait été plus cool si l'OP l'avait confirmé, mais bon... :roll:
En fait s'il y a plein de posts après celui où il y a le lien, le cliquer me renvoie au dernier post publié.
Truc de malade...
Je vous laisse continuer.
As tu essayé en vidant juste le cache (pas les cookies et tout le reste, juste le cache) de ton navigateur ?
Je viens de le faire. Ça marche. :ccool:
à mon tour :Code:
1
2
3
4
5
6 #!/bin/bash # objectif : déterminer si le premier argument est inférieur au second. # les arguments doivent être des nombres, qui peuvent être des décimaux. (($#==2)) || { >&2 echo "ERR: il faut donner deux arguments"; exit 1;} for f do [[ $f =~ ([^.,]*)[.,]*(.*) ]] && { i+=( "${BASH_REMATCH[1]:-0}" ); d+=( "${BASH_REMATCH[2]:-0}" );}; done (( ${i[0]}<${i[1]} ? 1 : ${d[0]}<${d[1]} ? 1 : 0 )) && echo "$1 < $2"
Merci beaucoup :)