2010-10-31 48 views
2

實數,我使用的是Windows計算機上的cygwin GAWK。 我想要做的是從三列中找到最小值和最大值,其中兩列是經緯度,第三列是值。上GAWK

這是代碼:

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和緯度相同。 我如何比較實數?

+1

你可以添加一些換行符,讓代碼更易理解嗎? – 2010-10-31 09:30:44

回答

3

我有理由相信,這條線

'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.我的版本,因爲他們都在BEGIN行進行初始化,只需初始化一次值。

+0

謝謝!它似乎工作我不知道我明白爲什麼 – eliavs 2010-11-07 06:44:56

+0

爲什麼是第一個gawk線路好嗎?發現最大的那個? – eliavs 2010-11-07 07:12:12

+0

AWk線有形式 – 2010-11-08 03:54:24