IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Extraire la valeur la plus basse en bash


Sujet :

Shell et commandes GNU

  1. #41
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ok, mais là, tu le fais pour un groupe, donc faut que tu boucles pour tous les groupes (que tu ne connais peut-être pas)
    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.
    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]

  2. #42
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2022
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2022
    Messages : 46
    Points : 1
    Points
    1
    Par défaut
    bref merci j'apprends bcp

  3. #43
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    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.
    Que c'est compliqué. La totalité du script tient en une ligne de deux "sort". Nul besoin de fonction, de grep, de boucle, etc.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #44
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    La totalité du script tient en une ligne de deux "sort". Nul besoin de fonction, de grep, de boucle, etc.
    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
    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
    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é

    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.

    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
    Et si demain on me dit "non, pas de grep/sort, il faut du bash pur" ben je modifie juste la fonction => évolutivité.
    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]

  5. #45
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 103
    Points : 4 449
    Points
    4 449
    Par défaut
    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= ( !== ) ? : ;

  6. #46
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Merci à vous deux.
    Citation Envoyé par disedorgue Voir le message
    Spécialement pour Jipété: https://forum.ubuntu-fr.org/viewtopic.php?id=2073578
    je pense que c'est la source.
    Je pense aussi.
    Juste que ça aurait été plus cool si l'OP l'avait confirmé, mais bon...

    Citation Envoyé par Sve@r Voir le message
    Et (pour Jipété) chez moi le lien a bien fonctionné. Mais on a fait remonter récemment des soucis d'affichage de pages et peut-être que c'est lié...
    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.
    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

  7. #47
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    As tu essayé en vidant juste le cache (pas les cookies et tout le reste, juste le cache) de ton navigateur ?
    Cordialement.

  8. #48
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Je viens de le faire. Ça marche.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #49
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Je viens de le faire. Ça marche.
    Je viens de le faire aussi : ça ne marche pas. En cliquant sur un lien je me retrouve au dernier post de la discussion. L'informatique aléatoire progresse...
    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

  10. #50
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    à 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"
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #51
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2022
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2022
    Messages : 46
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/05/2015, 14h57
  2. Extraire les lignes avec la valeur la plus élevée
    Par FanFan44 dans le forum Débutez
    Réponses: 4
    Dernier message: 27/08/2014, 17h06
  3. [XL-2007] Extraire la valeur la plus proche supérieure d'une liste
    Par atk_49 dans le forum Excel
    Réponses: 11
    Dernier message: 04/07/2014, 07h30
  4. [WD12] Extraire valeur la plus présente dans une série de nombre
    Par le pingouin fou dans le forum WinDev
    Réponses: 7
    Dernier message: 13/07/2011, 06h11
  5. [MySQL] Extraire les 50 valeurs les plus proches d'un entier
    Par denis.ws dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 19/01/2007, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo