Recherche du minimum dans un fichier

Résolu/Fermé
hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015 - 17 août 2009 à 12:51
hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015 - 31 août 2009 à 17:14
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
A voir également:

8 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
17 août 2009 à 13:00
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
hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015
17 août 2009 à 13:07
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
17 août 2009 à 13:18
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
hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015
17 août 2009 à 13:24
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
17 août 2009 à 13:26
Essaie ça :
grep -n "$(sort -n plop | head -1)" fichier
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015
17 août 2009 à 13:29
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
17 août 2009 à 13:32
Oups ;-((
grep -n "$(sort -n fichier | head -1)" fichier
Désolé ;-(
0
hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015
17 août 2009 à 13:36
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
17 août 2009 à 15:15
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
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
17 août 2009 à 17:10
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
17 août 2009 à 17:19
Ben voilà ;-))
0
hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015
27 août 2009 à 17:16
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
hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
27 août 2009 à 17:18
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
bob031 Messages postés 8158 Date d'inscription samedi 7 août 2004 Statut Membre Dernière intervention 1 septembre 2014 472 > hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015
27 août 2009 à 18:24
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > hbcrayon Messages postés 18 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 21 novembre 2015
27 août 2009 à 18:30
Essaye ça :
awk '{printf("%s %s %20.10f\n", NR, $1, $1)}' < fichier |sort -nk 3 | awk 'NR == 1 {print $1" : "$2 ; exit}'
;-))
0