2013-03-19 440 views
0

我目前正在編寫csh shell skript,並且想要比較存儲在文件中的數字。這個文件中只有一個數字存儲在例如-3.675000e + 050.000000e + 00 的問題是,我得到一個錯誤:csh shell:使用文件中的變量進行數值運算

if: Expression Syntax. 

當我這樣做:

#!/bin/csh 
set var1 = `cat file1` 
set var2 = `cat file2` 
set var3 = `cat file3` 

set maxtmp = 0 

foreach kmax (va1 var2 var3) 
    if ($kmax > $maxtmp) then 
    set maxtmp = $kmax 
    endif 

end 

我怎樣才能比較這些數字?

非常感謝!

回答

0

似乎有是兩個問題你的方法。

首先,在您的數據文件中的科學記數法會引起一些困難。但是,我們可以使用printf命令進行更正。如果你(如果你想避免使用xargs命令或替代,

set var1 = `cat file` ; set var1 = `printf "%f' $var1` 

修改值的初始分配如下

set var1 = `cat file1 | xargs printf "%f"` 
set var2 = `cat file2 | xargs printf "%f"` 
set var3 = `cat file3 | xargs printf "%f"` 

這將轉換您的科學記數法表示(例如,-3.675000e + 05)轉換爲簡單浮點值(例如,在第一個示例中爲-36750.0000)。 Csh不在數字的「e +」之下,並且感到困惑。

但是,我們沒有走出困境的相當尚未。 Csh也不理解負值,所以我們需要另一個命令來排除這些負值。 bc根據您的需要評估布爾查詢。

重寫你的foreach循環如下將評估比較正確

foreach kmax ($var1 $var2 $var3) 
    if (`echo "$kmax > $maxtmp" | bc`) then 
     set maxtmp = $kmax 
    endif 
end 

全部放在一起,你的腳本中的版本似乎工作:

#! /bin/csh 

set var1 = `cat file1 | xargs printf "%f"` 
set var2 = `cat file2 | xargs printf "%f"` 
set var3 = `cat file3 | xargs printf "%f"` 

set maxtmp = 0 

foreach kmax ($var1 $var2 $var3) 
    if (`echo "$kmax > $maxtmp" | bc`) then 
     set maxtmp = $kmax 
    endif 
end 

echo $maxtmp 
+0

感謝您的詳細回覆。最後我爲此寫了一個C Skript。然而,我嘗試了你的方法,它工作的很好!非常感謝! – MichaelScott 2013-03-22 16:29:50

0

使用$所以變量的值在foreach循環中。

另外,在第一可變應var1

foreach kmax ($var1 $var2 $var3) 
+0

感謝您的答覆!你是對的,我完全忘了「$」。不過,我得到了一個:「如果:形成不好的號碼。」錯誤! – MichaelScott 2013-03-19 13:03:32

+0

好的。文件是否只包含數字數據? – suspectus 2013-03-19 13:12:11

+0

我已經添加了另一個解決方案來處理非數字值。希望它有一些幫助。 – suspectus 2013-03-19 13:38:10

0

爲了應對非數字值 - 的問題:

set maxtmp=0 
foreach kmax ($var1 $var2 $var3) 
    if ("$kmax" =~ *[^0-9]*) then 
     set kv=-99999 
    else 
     set kv=$kmax 
    endif 

    if ($kv > $maxtmp) then 
     set maxtmp = $kv 
    endif 
end 

echo "max is $maxtmp"