Настоящий номер на Gawk
-
27-09-2019 - |
Вопрос
Я использую 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
Линия, просто инициализируйте значения один раз.