2011-08-28 154 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