Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Que c'est compliqué. La totalité du script tient en une ligne de deux "sort". Nul besoin de fonction, de grep, de boucle, etc.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.
Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
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 python : Sélectionner tout - Visualiser dans une fenêtre à part
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 bash : Sélectionner tout - Visualiser dans une fenêtre à part
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
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
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 : 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
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"
$moi= ( !== ) ? : ;
Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peut–être qu'il peut être sûr, etc.
Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
Mes 2 cts,
--
jp
As tu essayé en vidant juste le cache (pas les cookies et tout le reste, juste le cache) de ton navigateur ?
Cordialement.
Je viens de le faire. Ça marche.
Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peut–être qu'il peut être sûr, etc.
Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
Mes 2 cts,
--
jp
à mon tour :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager