Реальное число на gawk - PullRequest
       22

Реальное число на gawk

2 голосов
/ 31 октября 2010

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

Это код:

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%    

Что яget is:

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

Минимальное и максимальное значения одинаковы для lon и lat.Как я могу сравнить реальные цифры?

1 Ответ

3 голосов
/ 06 ноября 2010

Я вполне уверен, что эта строка

'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 }

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

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

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

...