2010-10-31 3 views
2

Я использую gawk на компьютере с Windows с cygwin. То, что я пытаюсь сделать, - найти min и max из трех столбцов, два - lat и lon, а третий - значение.Реальный номер на gawk

Это код:

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%  

Что я получаю:

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

Минимальные и максимальные одинаковы для долготы и лат. Как я могу сравнить действительные числа?

+1

Возможно, вы можете добавить некоторые фиды и такие, чтобы сделать код более понятным? –

ответ

3

Я достаточно уверен, что эта линия

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

не делать то, что вы думаете, что он делает. (Честно говоря, я поражен тем, что он скомпилирован вообще, я не думаю, что это было бы в Kernighan AWK.) И многое из того, что происходит здесь, фактически находится в том, что, файл Window BAT?

Но вот некоторые догадки.

  • Я думаю, что линия, которую я цитировал выше, устанавливает minc во время запуска, а затем устанавливает minlo и minlaкаждый раз он читает строку. Лучше будет

.

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

или даже

'BEGIN { minc = minlo = minla = 1000; } .... 
  • в AWK вы должны следить немного сравнениями, потому что если вы не будете осторожны, то принуждают ваши номера в строку и не сравнить строку (т.е. лексикографического порядка) вместо численного сравнения.

Ack, попытался сделать это как ответ на комментарий. Нет.

Причина первая линия не работает в том, что AWK линии имеют форму

PATTERN { code } 

, где ОБРАЗЕЦ некоторое выражение, которое идентифицирует набор входных записей (как правило, линии), по которому часть кода работает. Есть некоторые особые случаи, например BEGIN, которые «соответствуют» перед первым чтением. Другой особый случай - пустой шаблон, который соответствует каждой строке. Так что ты толкуется, как

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

Итак, перед первой строке входных данных обрабатывается, minc установлен в 1000. После , что на каждый линейный вход, minlo и minla установлены в 1000. Мои версии, поскольку все они выполняют инициализацию в строке BEGIN, просто инициализируйте значения один раз.

+0

спасибо!кажется, работает Я не уверен, что понимаю, почему – eliavs

+0

Почему первая линия gawk OK? тот, который находит максимум? – eliavs

+0

AWk линии имеют форму –