1

私は現在cshシェルスクリプトを書いていますが、ファイルに保存されている数値を比較したいと思います。このファイルに保存されている番号は1つだけです(例:-3.675000e+05または0.000000e+00 )。問題は、エラーが発生することです。

 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

これらの数値を比較するにはどうすればよいですか?

どうもありがとう!

4

3 に答える 3

1

あなたのアプローチには2つの問題があるようです。

まず、データファイルの科学的記数法が問題を引き起こしています。ただし、printfコマンドを使用して修正できます。値の初期割り当てを次のように変更した場合

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

(または、

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

xargsコマンドの使用を避けたい場合)

これにより、科学的記数法の数値(たとえば、-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
于 2013-03-20T05:45:18.293 に答える
0

$を使用して、変数のがforeachループに入るようにします。

また、最初の変数はである必要がありますvar1

 foreach kmax ($var1 $var2 $var3)
于 2013-03-19T12:15:36.363 に答える
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"
于 2013-03-19T13:38:24.590 に答える