我在 Windows 计算机上使用 gawk 和 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%    

我得到的是:

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

经度和纬度的最小值和最大值相同。我如何比较实际数字?

有帮助吗?

解决方案

我相当确定这条线

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

不做你认为它做的事。(坦率地说,我对它的编译感到惊讶,我不认为它会在 Kernighan AWK 中编译。)这里发生的很多事情实际上是在 Window 中进行的 BAT 文件?

但这里有一些猜测。

  • 我认为我上面引用的那行集 minc 在开始时间,然后设置 minlominla 每次 它读取一行。更好的是

.

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

甚至

 'BEGIN { minc = minlo = minla = 1000; } ....
  • 在 AWK 中,您必须小心比较,因为如果您不小心,它会将您的数字强制转换为字符串,并进行字符串比较(即字典顺序)而不是数字比较。

确认,尝试这样做作为对评论的回答。不去。

第一行不起作用的原因是 AWK 行具有以下形式

PATTERN { code }

其中 PATTERN 是一些表达式,用于标识代码部分操作的一组输入记录(通常是行)。有一些特殊情况,例如 BEGIN, ,在第一次读取之前“匹配”。另一个特殊情况是空模式,它匹配每一行。所以你所拥有的被解释为

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

因此,在处理第一行输入之前, minc 设置为 1000。 下列的 那个,关于 每一个 输入线, minlominla 设置为 1000。我的版本,因为它们都在 a 中进行初始化 BEGIN 行,只需初始化一次值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top