2

cygwinを搭載したWindowsコンピューターでgawkを使用しています。私がやろうとしているのは、3つの列から最小値と最大値を見つけることです。2つはlatとlonで、3番目の列は値です。

これはコードです:

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で同じです。実数を比較するにはどうすればよいですか?

4

1 に答える 1

3

私はこの行が合理的に確信しています

'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では、比較に少し注意する必要があります。注意しないと、数値を文字列に強制し、数値比較の代わりに文字列比較(辞書式順序)を実行するためです。

ああ、コメントへの答えとしてこれをやろうとした。立ち入り禁止。

最初の行が機能しない理由は、AWK行の形式が

PATTERN { code }

ここで、PATTERNは、コード部分が動作する入力レコードのセット(通常は行)を識別する式です。BEGINたとえば、最初に読み取られる前に「一致」する特殊なケースがいくつかあります。もう1つの特殊なケースは、すべての行に一致する空のパターンです。だからあなたが持っていたものは次のように解釈されていました

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

したがって、入力の最初の行が処理される前に、mincは1000に設定されます 。その後すべての入力行で、minlo1000minlaに設定されます。私のバージョンはすべて1BEGIN行で初期化を行うため、値を1回だけ初期化します。

于 2010-11-06T06:04:22.627 に答える