[SHELL] max et min d'une colonne de données && arithmétique flottante

max et min d'une colonne de données && arithmétique flottante [SHELL] - Shell/Batch - Programmation

Marsh Posté le 20-05-2003 à 11:28:50    

Voila j'ai un fichier qui ressemble a ca :
 

Citation :

# debit | SNR | refFrame
14296 23.31 12
14416 23.37 13
14256 23.38 14
14352 23.38 15
14392 23.30 16
14400 23.33 17
14400 23.37 18
14320 23.30 19
14568 23.31 20
14840 23.37 21
14656 23.30 22
14464 23.33 23
14760 23.33 24

 
 
et je voudrai obtenir le max et le min de la deuxieme colonne.
 
J'ai donc pensé a sort, ca me donne


min=sort -k 2,2 fichier.dat | gawk '{n++; if (n==1) print $2}'
max=sort -r -k 2,2 fichier.dat | gawk '{n++; if (n==2) print $2}'


 
ca marche, mais bon je suis encore novice et je connais pas toutes les bonnes ficelles du shell, donc si quelqu'un a une autre méthode je suis interessé ... :)
 
2eme question : comment effectuer une operation simple avec des réels  :??: du genre 2.5/7 ... expr n'utilise que des entiers et je vois pas autre chose  :(


Message édité par bobuse le 20-05-2003 à 16:43:30

---------------
get amaroK plugin
Reply

Marsh Posté le 20-05-2003 à 11:28:50   

Reply

Marsh Posté le 20-05-2003 à 12:59:14    

tu veux un petit script python?

Reply

Marsh Posté le 20-05-2003 à 13:31:37    

++Taz a écrit :

tu veux un petit script python?


ben pkoi pas, mais bon, j'aurai prefere une solution plus "directe"


---------------
get amaroK plugin
Reply

Marsh Posté le 20-05-2003 à 13:50:12    

FD=open('echantillon')
 
FD.readline()
 
mini=maxi=FD.readline().split()[1]
 
for ligne in FD:
    x=ligne.split()[1]
    mini=min(x, mini)
    maxi=max(x, maxi)
 
print "max=%s min=%s" % (maxi, mini)

Reply

Marsh Posté le 20-05-2003 à 14:00:27    

mouaif bon finalement, je garde mon sort/gawk [:spamafote]  
 
et pour mes operations arithmetique flottante, je vais y aller a coup de perl


---------------
get amaroK plugin
Reply

Marsh Posté le 20-05-2003 à 14:29:46    

tu fait bien

Reply

Marsh Posté le 20-05-2003 à 14:55:59    

bon ben en fait j'ai rusé pour pas appeler perl juste pour un division ... je passe par gawk :


echo $var1 $var2 | gawk '{print $1/$2}'  


et hop :D  
 
pour ceux qui aiment pas les pipe :


gawk 'BEGIN {print '$var1'/'$var2'}' -f /dev/null


Message édité par bobuse le 20-05-2003 à 14:59:03

---------------
get amaroK plugin
Reply

Marsh Posté le 20-05-2003 à 15:41:28    

pour les opérations ismples, tu gagneras de la vitesse avec expr

Reply

Marsh Posté le 20-05-2003 à 15:56:44    

++Taz a écrit :

pour les opérations ismples, tu gagneras de la vitesse avec expr


ben oui je sais, mais ce couillon marche qu'avec des entiers :/


---------------
get amaroK plugin
Reply

Marsh Posté le 20-05-2003 à 16:35:13    

Citation :

arithmétique entière

   [:spamafote]

Reply

Marsh Posté le 20-05-2003 à 16:35:13   

Reply

Marsh Posté le 20-05-2003 à 16:43:00    

++Taz a écrit :

Citation :

arithmétique entière

   [:spamafote]  


[:neowen]


---------------
get amaroK plugin
Reply

Marsh Posté le 20-05-2003 à 16:44:56    

:D

Reply

Marsh Posté le 22-05-2003 à 17:10:13    

Et..euuuh.. ça :  
 
min=sort -k 2,2 fichier.dat | head -1 | awk '{print $2}'
max=sort -k 2,2 fichier.dat | tail -1 | awk '{print $2}'
 
ça irait pas plus vite?? Disons que si ton fchier est gros, awk ne le parsera pas.

Reply

Marsh Posté le 22-05-2003 à 17:18:36    

ouais fin awk de toutes façons, c'est pas ce qu'il y a de plus rapide...
 
autant ecrire un programme en nimporte quoi, ca va plus vite et ca tourne mieux

Reply

Marsh Posté le 22-05-2003 à 17:22:33    

bah, awk, ça marche très bien, pour peu qu'on s'en serve à bon escient (genre, pas sur des fichiers super énormes)...Par exemple, pour extraire le 2° champ de la ligne (ce que fait awk en l'occurence) c'est très bien...

Reply

Marsh Posté le 22-05-2003 à 17:31:05    

et cut ça vous dit rien?

Reply

Marsh Posté le 22-05-2003 à 17:49:41    

Si, aussi, mais bon, je connais awk, et pas bien cut, alors quand j'ai des trucs de ce genre à faire, j'utilise awk.  
Par exemple, pour écrire dans un fichier :  
 
Valeur max = 23.38 totos
Valeur min = 23.30 totos, avec un seul parcours du fichier... Tu ferais comment???
 
moi, je fais ça :  
 
 

Code :
  1. awk 'BEGIN {min=1000; max=0} /^[^#]/ {if ($2 < min) {min=$2}; if (max < $2) {max=$2}} END {print "Valeur max = "max" totos\nValeur min = "min" totos"}' < fichier.dat

 
 
et ça marche nickel. (sauf avant l'édit, j'avais oublié un " )


Message édité par gfive le 22-05-2003 à 17:51:01
Reply

Marsh Posté le 22-05-2003 à 18:32:21    

++Taz a écrit :

et cut ça vous dit rien?


non :o


---------------
get amaroK plugin
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed