Recherche du minimum dans un fichier
Résolu
hbcrayon
Messages postés
18
Date d'inscription
Statut
Membre
Dernière intervention
-
hbcrayon Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
hbcrayon Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Recherche du minimum dans un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
8 réponses
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 ?
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 ?
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
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
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 !)
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 !)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
>>>>
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
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 !!!
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 !!!
Il n'y aura que des puissances de 10 ?
C'est un peu tiré par les cheveux, mais bon...
;-))
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...
;-))
hello
une solution avec awk
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
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
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
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
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