2012-06-28 11 views
18

मैं दो दशमलव मानों की तुलना करने की कोशिश कर रहा हूं लेकिन मुझे त्रुटियां मिल रही हैं। के रूप में अन्य स्टैक ओवरफ़्लो धागा ने सुझाव दिया मैंbash/awk में दो दशमलव संख्याओं की तुलना कैसे करें?

if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ];then 

इस्तेमाल किया।

मुझे त्रुटियां मिल रही हैं।

इस बारे में जाने का सही तरीका क्या है?

+0

त्रुटियाँ क्या हैं? गलत वर्तनी एक चर नाम। – ormaaj

+0

वास्तव में त्रुटियां कुछ अन्य मुद्दों के कारण हैं। यह ठीक काम करता है। –

+0

'दशमलव मान' से आपका क्या मतलब है? क्या आपका मतलब आधार 10 में पूर्णांक है, या क्या आपका मतलब स्ट्रिंग्स है जो गैर-पूर्णांक वास्तविक मानों का प्रतिनिधित्व करते हैं? –

उत्तर

29

आप बैश के संख्यात्मक संदर्भ का उपयोग कर ऐसा कर सकते हैं:

if (($(echo "$result1 > $result2" | bc -l))); then 

bc इच्छा उत्पादन 0 या 1 और (()) क्रमशः उन्हें गलत या सही व्याख्या करेगा।

एक ही बात AWK का उपयोग कर:

if (($(echo "$result1 $result2" | awk '{print ($1 > $2)}'))); then 
+10

+1, लेकिन: अगर echo $ result1 $ result2 | अजीब '{निकास! ($ 1> $ 2)}'; तो ... ' –

+0

मुझे अपना डाउन वोट वापस लेना पसंद है क्योंकि डेनिस का जवाब दशमलव बिंदुओं के साथ सही है। बैश का उपयोग करके गणित के विस्तारित फ्लोटिंग पॉइंट के लिए, नीचे मेरा जवाब देखें। – Samir

+0

@ सैमिर: यदि आप पहले से नहीं हैं, तो आप डाउनवोट को उलट करने के लिए नीचे तीर पर फिर से क्लिक कर सकते हैं। –

-1

भी कर सकते हैं echobc के लिए एक if...else बयान।

- echo $result1 '>' $result2 
+ echo "if (${result1} > ${result2}) 1 else 0" 

(
#export IFS=2 # example why quoting is important 
result1="2.3" 
result2="1.7" 
if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ]; then echo yes; else echo no;fi 
if [ "$(echo "if (${result1} > ${result2}) 1 else 0" | bc -l)" -eq 1 ];then echo yes; else echo no; fi 
if echo $result1 $result2 | awk '{exit !($1 > $2)}'; then echo yes; else echo no; fi 
) 
8
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "$z" "$y" 
then 
    echo z not greater than y 
else 
    echo z greater than y 
fi 
-3

क्यों बीसी का उपयोग करें?

for i in $(seq -3 0.5 4) ; do echo $i ; if [[ (("$i" < 2)) ]] ; then echo "... is < 2";fi; done 

केवल समस्या: तुलना "<" ऋणात्मक संख्याओं के साथ काम नहीं करता है: वे अपने निरपेक्ष मूल्य के रूप में लिया जाता है।

+0

'<' अंदर '[[...]] 'स्ट्रिंग तुलना के लिए है (इसलिए' 20' '3' से कम है, और' 0.2' '1e-50' से कम है)। '(' अनावश्यक हैं, आप जितना चाहें उतना जोड़ सकते हैं, वे केवल समूह के लिए हैं। –

-2

बल प्रकार रूपांतरण को बाधित नहीं कर सकता है? उदाहरण के लिए:

($result1 + 0) < ($result2 + 0) 
+0

कोई भी बैश प्रकार रूपांतरण, जैसे perl, आदि को मजबूर नहीं कर सकता ... –

0

डेनिस के जवाब पर बाद:

हालांकि उनके जबाब दशमलव अंक के लिए सही है, तो पार्टी फेंकता (standard_in) 1: चल बिन्दु गणित के साथ सिंटेक्स त्रुटि

result1=12 
result2=1.27554e-05 


if (($(echo "$result1 > $result2" | bc -l))); then 
    echo "r1 > r2" 
else 
    echo "r1 < r2" 
fi 

यह हालांकि 0.

(standard_in) 1 के बाहर निकलने के कोड के साथ एक चेतावनी के साथ गलत उत्पादन देता है: सिंटैक्स त्रुटि
r1 < r2

जबकि वहाँ है कोई इस के लिए स्पष्ट समाधान (चर्चा thread 1 और thread 2), मैंनेका उपयोग करके फ़्लोटिंग पॉइंट परिणामों को गोल करके निम्नलिखित आंशिक फ़िक्स का उपयोग कियाके बाद bc कमांड के रूप में डेनिस के उत्तर और this thread

वांछित दशमलव स्थान पर गोल करें: निम्नलिखित दशमलव स्थान पर गोल करने के साथ टीबी में पुनरावर्ती निर्देशिका स्थान प्राप्त होगा।

result2=$(du -s "/home/foo/videos" | tail -n1 | awk '{$1=$1/(1024^3); printf "%.2f", $1;}') 

फिर आप ऊपर दिए या following thread में के रूप में [[ ]] बाड़े का उपयोग कर के रूप में बैश गणित का उपयोग कर सकते हैं।

if (($(echo "$result1 > $result2" | bc -l))); then 
    echo "r1 > r2" 
else 
    echo "r1 < r2" 
fi 

या -eq ऑपरेटर का उपयोग जहां 1 का bc उत्पादन सच और 0 है गलत है

if [[ $(bc <<< "$result1 < $result2") -eq 1 ]]; then 
    echo "r1 < r2" 
else 
    echo "r1 > r2" 
fi 
0
if [[ `echo "$result1 $result2" | awk '{print ($1 > $2)}'` == 1 ]]; then 
    echo "$result1 is greater than $result2" 
fi 
संबंधित मुद्दे