Вопрос

Я использую Gawk на компьютере Windows с Cygwin. То, что я пытаюсь сделать, это найти мин и максимум из трех столбцов, два - это лат и LON, а третий столбец - это значение.

Это код:

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    

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

Это было полезно?

Решение

Я разумно уверен, что эта линия

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

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

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

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

.

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

или даже

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

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

Причина, по которой первая строка не работает, так это то, что строки awk имеют форму

PATTERN { code }

Там, где Pattern - это некоторое выражение, которое определяет набор входных записей (обычно строки), на которых работает кодовая часть. Есть несколько особых случаев, например BEGIN, какие «матчи» до первого времени читается. Другим особым случаем является пустой шаблон, который соответствует каждую строку. Так что вы были интерпретировать как

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top