File csh shell:使用文件中的变量执行数值操作
我目前正在编写一个cshshell skcript,希望比较存储在文件中的数字。此文件中只存储一个数字,例如-3.675000e+05或0.000000e+00 问题是,我得到了一个错误: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
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。尽管如此,我还是得到了一个:“如果:格式错误的数字。”错误!我添加了另一个解决方案来处理非数值。希望能对您有所帮助。谢谢您的详细回复。最后我为此写了一篇短文。然而,我尝试了你的方法,效果很好!非常感谢!谢谢你的详细回复。最后我为此写了一篇短文。然而,我尝试了你的方法,效果很好!非常感谢!