Recherche du minimum dans un fichier

Résolu
hbcrayon Messages postés 18 Statut Membre -  
hbcrayon Messages postés 18 Statut Membre -
Bonjour à tous,

Existe-t-il une commande simple qui me permette de retrouver la valeur minimum contenue dans un fichier texte qui contient une valeur numérique par ligne ?

Genre
>>> minimum fichier.txt

Enfin je ne suis pas une pro de linux donc je pense que cette commande doit exister mais pas sous ce nom-là !

Et le numéro de la ligne à laquelle il se trouve aussi...

Merci,
HBcrayon

8 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Tout dépend de comment sont représentées les valeurs dans ton fichier ;-\

    As-tu un exemple de fichier et de ce que tu voudrais obtenir en sortie ?
    0
  2. hbcrayon Messages postés 18 Statut Membre
     
    Le fichier se présente comme ça :
    184.60
    137.28
    113.85
    85.27
    53.73
    21.37
    4.03
    4.02
    3.92
    3.91
    3.85
    3.84
    3.80
    3.71
    3.26
    1.19
    0.21
    0.10
    0.08
    0.07
    0.07
    ... (50 valeurs en tout)

    et je veux juste afficher à l'écran la plus petite valeur et le numéro de la ligne.

    D'ailleurs, je viens de remarquer qu'un truc m'embête car le fichier ne contient que des valeurs précise à 2 chiffres après la virgule alors que les valeurs initiales sont beaucoup plus précises.

    Mon fichier initial ressemble à ça :
    ITERATION = 1 on grands-pas
    - SHOT = 1
    CurrentMisfit (abs) = 9.8527912E+07
    CurrentMisfit (%) = 184.6047
    - SHOT = 1
    TestMisfit = 8.9954960E+07
    CorrMisfit = -5076911.
    DiffMisfit = 1579421.
    step_numerat = 0.0000000E+00 | step_denomin = 2.2477965E-05
    step_numerat = -5076911. | step_denomin = 1579421.
    iter= 1 : 184.60 | 0.00 | 168.54 | -9.51 | 2.96 | 0.252E+00 | 3.214

    ITERATION = 2 on grands-pas
    - SHOT = 1
    CurrentMisfit (abs) = 7.3270552E+07
    CurrentMisfit (%) = 137.2818
    alpha = -9.6228242E-02
    - SHOT = 1
    TestMisfit = 6.0764304E+07
    CorrMisfit = -7816828.
    DiffMisfit = 3125115.
    iter= 2 : 137.28 | 0.00 | 113.85 | -14.65 | 5.86 | 0.638E+00 | 1.000

    (avec 50 fois le même bloc)

    Et mon fichier sur lequel je travaille est construit avec la commande suivante :
    grep iter fichiercomplique.txt | grep -v NaN | awk '{print $4}' > fichtemp.txt

    Le manque de précision va être un problème pour la sélection de ma valeur minimum. Donc comment puis-je y remédier ?

    Merci,
    HBcrayon
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Il est déjà trié ton fichier là ? Ça sera toujours le cas ?

      Ensuite pour ton histoire de valeur plus précise, pourquoi ne récupères-tu pas la ligne avec "CurrentMisfit (%) =" qui apparemment contient la bonne valeur, plutôt que la ligne avec "iter" ?
      0
  3. hbcrayon Messages postés 18 Statut Membre
     
    Oui pour la réponse à la deuxième question, j'ai déjà corrigé et j'ai les valeurs plus précises.

    Par contre, c'est oui et non à la 1ère question car en fait la valeur diminue jusqu'à un seuil qui dépend de chaque expérience (c'est une série de 50 itérations sur une inversion de données) puis oscille de peu mais ça peut compter quand même donc non la dernière valeur n'est pas toujours la plus petite... ce serait trop simple !!!!!

    Le nouveau fichier sur lequel je travaille ressemble à ça :
    184.6047
    137.2818
    113.8497
    85.27073
    53.73389
    21.37161
    4.027525
    4.019840
    3.916320
    3.912370
    3.850162
    3.840795
    3.795539
    3.710032
    3.262137
    1.193330
    0.2067064
    9.7332962E-02
    8.1045449E-02
    7.0168599E-02
    6.9240019E-02
    6.9212057E-02
    6.9187112E-02
    6.9196522E-02
    6.9196321E-02
    6.9202892E-02
    6.9205575E-02
    6.9212317E-02
    6.9219872E-02
    6.9221303E-02
    6.9222197E-02
    ...
    6.9230862E-02 (exemple comme quoi la dernière valeur n'est pas forcément la plus petite !)
    0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Essaie ça :
    grep -n "$(sort -n plop | head -1)" fichier
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. hbcrayon Messages postés 18 Statut Membre
     
    La réponse est simple : sort ne fonctionne pas !!

    >>>>
    sort: Échec d'ouverture: plop: Aucun fichier ou dossier de ce type
    1:184.6047
    2:137.2818
    3:113.8497
    4:85.27073
    5:53.73389
    ...
    50:6.9230862E-02
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Oups ;-((
      grep -n "$(sort -n fichier | head -1)" fichier
      Désolé ;-(
      0
  7. hbcrayon Messages postés 18 Statut Membre
     
    Apparemment ce n'est pas mal, mais il ne comprend les puissances de 10 donc cela me donne pour les 23 premières valeurs suivant :
    1:184.6047
    2:137.2818
    3:113.8497
    4:85.27073
    5:53.73389
    6:21.37161
    7:4.027525
    8:4.019840
    9:3.916320
    10:3.912370
    11:3.850162
    12:3.840795
    13:3.795539
    14:3.710032
    15:3.262137
    16:1.193330
    17:0.2067064
    18:9.7332962E-02
    19:8.1045449E-02
    20:7.0168599E-02
    21:6.9240019E-02
    22:6.9212057E-02
    23:6.9187112E-02

    la réponse 17:0.2067064 qui est le minimum si les puissances de 10 ne sont pas prises en compte !!!
    0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Il n'y aura que des puissances de 10 ?

    C'est un peu tiré par les cheveux, mais bon...
    jp@MDK:~/tmpfs ssh$ cat plop
    184.6047
    137.2818
    113.8497
    85.27073
    53.73389
    21.37161
    4.027525
    4.019840
    3.916320
    3.912370
    3.850162
    3.840795
    3.795539
    3.710032
    3.262137
    1.193330
    0.2067064
    9.7332962E-02
    8.1045449E-02
    7.0168599E-02
    6.9240019E-02
    6.9212057E-02
    6.9187112E-02
    6.9196522E-02
    6.9196321E-02
    6.9202892E-02
    6.9205575E-02
    6.9212317E-02
    6.9219872E-02
    6.9221303E-02
    6.9222197E-02
    
    jp@MDK:~/tmpfs ssh$ B=$(echo "$(while read line;do echo "scale=9;${line/E*//100}" | bc;done < plop | sort -n | head -1) * 100" | bc)
    
    jp@MDK:~/tmpfs ssh$ grep -n "${B::9}" plop
    23:6.9187112E-02
    
    jp@MDK:~/tmpfs ssh$
    Il y a sûrement une solution plus élégante (awk ? Perl ?), faut voir...

    ;-))
    0
  9. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    une solution avec awk
    $ awk '{printf("%s %20.10f\n", $1, $1)}' < fichier |sort -nk 2 | awk 'NR == 1 {print $1 ; exit}'
    6.9187112E-02
    
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Ben voilà ;-))
      0
    2. hbcrayon Messages postés 18 Statut Membre
       
      Merci dubcek...

      Je mets un peu de temps à répondre j'ai eu d'autre chose à gérer avant.

      Ce qui m'embête c'est que oui j'ai le minimum maintenant mais je ne vois pas comment obtenir le numero de la ligne où il se trouve... ce qui est important pour moi car il correspond au numéro de l'itération que je dois connaître !

      Quelle commande dois-je faire en faire ? Surement un head -1 quelquepart mais où ?

      Merci d'avance
      HBcrayon
      0
    3. hbcrayon Messages postés 18 Statut Membre > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Merci Jipicy, tu t'es vraiment cassé la tête pour moi et ça me touche.

      Je viens de poser encore un petit détail pour connaître le numéro de la ligne où on trouve le minimum et après c'est fini...

      Et franchement vous m'avez vraiment aidé car ça commençait sérieusement à me saoûler de le faire manuellement en regardant chaque fichier !!!

      Quelle grosse épine du pied enlevée !

      Merci,
      HBcrayon
      0
    4. bob031 Messages postés 8228 Statut Membre 473 > hbcrayon Messages postés 18 Statut Membre
       
      Bonjour,

      sinon il y a un petit outil : num-utils

      http://suso.suso.org/programs/num-utils/

      mais cela devient ensuite un peu compliqué pour ce type d'outil ...
      0
    5. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > hbcrayon Messages postés 18 Statut Membre
       
      Essaye ça :
      awk '{printf("%s %s %20.10f\n", NR, $1, $1)}' < fichier |sort -nk 3 | awk 'NR == 1 {print $1" : "$2 ; exit}'
      ;-))
      0