2011-08-28 150 views
0

我想检查我从一个文本文件中读取值为零:问题与浮点比较

[[ $(echo $line | cut -d" " -f5) -gt 0 ]] && [[ $(echo $line | cut -d" " -f7 | bc -l) -eq 0 ]] 

第一条件是没有问题的,因为F5是整数。问题来自第二个条件。我收到此错误信息:

[[: 1.235: syntax error: invalid arithmetic operator (error token is ".235") 

我尝试了好几种建议,我在不同的论坛,如使用echo $line | cut -d" " -f7 | bc -l使用和不使用双引号,等等。然而发现,错误仍然存​​在。 f7是一个正数,并给出3个小数位。去除小数或近似值不是一个选项,因为我需要的结果恰好为零(0.000)。

回答

1

改为使用字符串比较。替换:

-eq 0 

有:

= '0.000' 

TZ:

从评论

脚本部分:

for clus in $(ls *.cluster) ; do 
    while read line ; do 
     if [[ $(echo $line | cut -d" " -f11) -gt 0 ]] && [[ "$(echo $line | cut -d" " -f15 | bc -l)" = '0.000' ]] ; then 
      cat $(echo $line | cut -d" " -f6).pdb >> test/$(echo $line | cut -d" " -f2)_pisa.pdb 
     fi 
    done < $clus 
done 

我伪的Python解释:

for clus in *.cluster: 
    for line in clus: 
     fields = line.split(' ') 
     # field numbers are counting from 1 as in cut 
     if int(field 11) > 0 and str(field 15) == '0.000': 
      fin_name = (field 6) + '.pdb' 
      fout_name = (field 2) + '_pisa.pdb' 
      cat fin_name >> fout_name 

这是你的意图吗?

+0

做,谢谢! – mirix

+0

它不起作用。错误消失了。但是,由于错误,程序工作正常并且生成正确的输出。现在它不。 – mirix

+0

发布脚本?或者出问题的部分?可能与此无关,所以你可能想发布一个新问题。 for $(ls * .cluster)中的clus的 –

2

通常,您无法比较浮点数是否相等。这是因为十进制数的二进制表示形式不准确,而且会出现舍入错误。这是大多数人会给你的标准答案。

在这种特殊情况下,您实际上并不需要比较浮点数,因为您只是测试某些文本是否代表特定数字。既然你在shell中,你可以使用常规字符串比较“0.000” - 假设你的数据是以这种方式舍入的 - 或者使用正则表达式和grep/egrep。像

egrep -q '0(|\.0+)' 

事情会匹配0,0.0,0.00,等,将退出指示成功或失败,你可以在if语句周围使用:

if cut and pipe soup | egrep ... ; then 
    ... 
fi