File csh shell:使用文件中的变量执行数值操作

File csh shell:使用文件中的变量执行数值操作,file,numbers,compare,csh,cat,File,Numbers,Compare,Csh,Cat,我目前正在编写一个cshshell skcript,希望比较存储在文件中的数字。此文件中只存储一个数字,例如-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 v

我目前正在编写一个cshshell skcript,希望比较存储在文件中的数字。此文件中只存储一个数字,例如-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
我如何比较这些数字


非常感谢

使用$,使变量的值进入foreach循环

此外,第一个变量应该是
var1

 foreach kmax ($var1 $var2 $var3)

使用$,使变量的值进入foreach循环

此外,第一个变量应该是
var1

 foreach kmax ($var1 $var2 $var3)

要处理非数值问题-:

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"

要处理非数值问题-:

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"

你的方法似乎有两个问题

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

你的方法似乎有两个问题

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

谢谢你的回复!你是对的,我完全忘记了“$”s。尽管如此,我还是得到了一个:“如果:格式错误的数字。”错误!我添加了另一个解决方案来处理非数值。希望能对你有所帮助。谢谢你的回复!你是对的,我完全忘记了“$”s。尽管如此,我还是得到了一个:“如果:格式错误的数字。”错误!我添加了另一个解决方案来处理非数值。希望能对您有所帮助。谢谢您的详细回复。最后我为此写了一篇短文。然而,我尝试了你的方法,效果很好!非常感谢!谢谢你的详细回复。最后我为此写了一篇短文。然而,我尝试了你的方法,效果很好!非常感谢!