2010-10-31 37 views
2

J'utilise gawk sur un ordinateur Windows avec cygwin. Ce que j'essaie de faire est de trouver min et max à partir de trois colonnes, deux sont lat et lon et la troisième colonne est la valeur.Nombre réel sur gawk

Voici le code:

echo off  
for /f "tokens=1,2,3 delims= " %%a in  
    ('gawk "BEGIN {maxc = 0} {maxlo=0} {maxla=0}  
    {if ($3>maxc) maxc=$3} {if ($1>maxlo) maxlo=$1} {if ($2>maxla) maxla=$2} END  
    {print maxc, maxlo, maxla}" %file%.projected')  
do (
    set maxc=%%a  
    set maxlo=%%b  
    set maxla=%%c  
) 
echo max is %maxc% 
echo max is %maxla% 
echo max is %maxlo% 

for /f "tokens=1,2,3 delims= " %%a in  
('gawk "BEGIN {minc =1000} {minlo=1000} {minla=1000}  
    {if ($3<minc) minc=$3} {if ($1<minlo) minlo=$1} {if ($2<minla) minla=$2} END  
    {print minc, minlo, minla}" %file%.projected')  
do (
    set minc=%%a  
    set minlo=%%b  
    set minla=%%c  
)  
echo min %minc%  
echo min %minla%  
echo min %minlo%  

Qu'est-ce que je reçois est:

max is 465.053890  
max latitude is 31.846428  
max is 34.877658  
min 19.976970  
min 31.846428  
min 34.877658  

min et max sont les mêmes pour la latitude et LON. Comment puis-je comparer des nombres réels?

+1

pouvez-vous peut-être ajouter des sauts de ligne et autres pour rendre le code plus intelligible? –

Répondre

3

Je suis raisonnablement sûr que cette ligne

'gawk "BEGIN {minc =1000} {minlo=1000} {minla=1000} 

ne fait pas ce que vous pensez. (Franchement, je suis étonné que cela ait été compilé du tout, je ne pense pas que cela aurait été le cas dans Kernighan AWK.) Et beaucoup de ce qui se passe ici est en fait, quoi, un fichier Window BAT?

Mais voici quelques suppositions.

  • Je pense que la ligne que je citais place au-dessus minc au moment du démarrage, et définit ensuite minlo et minlachaque fois il lit une ligne. Mieux serait

.

'BEGIN { minc = 1000; minlo = 1000; minla = 1000; } .... 

ou même

'BEGIN { minc = minlo = minla = 1000; } .... 
  • en AWK vous devez regarder un peu avec des comparaisons, parce que si vous ne faites pas attention, il contraint vos numéros de chaîne et une chaîne en comparaison (c.-à- ordre lexicographique) au lieu d'une comparaison numérique. Ack, a essayé de le faire comme une réponse à un commentaire

Ne pas aller.

La raison pour laquelle la première ligne ne fonctionne pas est que les lignes AWK ont la forme

PATTERN { code } 

où PATRON est une expression qui identifie un ensemble d'enregistrements d'entrée (généralement des lignes) sur lequel la partie de code est présent. Il y a des cas spéciaux, par exemple BEGIN, qui "correspond" avant la première lecture. Un autre cas particulier est le motif vide, qui correspond à chaque ligne. Donc ce que vous aviez était interprété comme

BEGIN {minc =1000} 
     {minlo =1000} 
     {minla =1000} 

Ainsi, avant la première ligne d'entrée est traitée, minc est réglé sur 1000. Après que, sur chaque ligne d'entrée, minlo et minla sont mis à 1000. Mes versions, puisqu'elles effectuent toutes l'initialisation dans une ligne BEGIN, initialisez simplement les valeurs une fois.

+0

merci!il semble fonctionner je ne suis pas sûr que je comprends pourquoi – eliavs

+0

pourquoi est la première ligne de gawk OK? celui qui trouve le maximum? – eliavs

+0

AWK lignes ont la forme –