1

我目前正在编写一个csh shell 脚本并想比较存储在文件中的数字。此文件中仅存储一个数字,例如-3.675000e+050.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

你的方法似乎有两个问题。

首先,数据文件中的科学记数法造成了一些困难。但是,我们可以使用该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

处理非数字值的问题-:

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 回答
0

使用 $ 使变量的进入 foreach 循环。

第一个变量也应该是var1.

 foreach kmax ($var1 $var2 $var3)
于 2013-03-19T12:15:36.363 回答