如何比较bash / awk中的两个十进制数?

时间:2012-06-28 03:43:54

标签: bash shell awk

我正在尝试比较两个十进制值但我收到错误。 我用了

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

正如其他Stack Overflow线程所建议的那样。

我收到错误。

解决这个问题的正确方法是什么?

8 个答案:

答案 0 :(得分:36)

您可以使用Bash的数字上下文来完成:

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

bc将输出0或1,(( ))将分别将其解释为false或true。

使用AWK同样的事情:

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

答案 1 :(得分: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

答案 2 :(得分:1)

跟进丹尼斯的回复:

虽然他的回答对于小数点是正确的,但bash使用浮点运算抛出(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&lt; R2

虽然没有明确的解决方案(讨论thread 1thread 2),但我使用awk后续使用{{1来对浮点结果进行舍入后使用了以下部分修复在Dennis的回复和this thread

中命令

舍入到所需的小数位:以下将获得TB中的递归目录空间,并在小数点后第二位四舍五入。

bc

然后您可以使用上述bash算法或following thread中使用result2=$(du -s "/home/foo/videos" | tail -n1 | awk '{$1=$1/(1024^3); printf "%.2f", $1;}') 附件。

[[ ]]

或使用if (( $(echo "$result1 > $result2" | bc -l) )); then echo "r1 > r2" else echo "r1 < r2" fi 运算符,其中-eq输出1为 true 且0为 false

bc

答案 3 :(得分:1)

if [[ `echo "$result1 $result2" | awk '{print ($1 > $2)}'` == 1 ]]; then
  echo "$result1 is greater than $result2"
fi

答案 4 :(得分:0)

对于 shell 脚本,我不能使用双括号 (())。所以,帮助我的是将其分成两行并以经典方式进行比较。

low_limit=4.2
value=3.9
        
result=$(echo "${value}<${low_limit}" | bc)
    
if [ $result = 1 ]; then
  echo too low; 
else 
  echo not too low; 
fi

答案 5 :(得分:-1)

您还可以echo if...else语句bc

- 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
)

答案 6 :(得分:-2)

不能强制进行类型转换吗?例如:

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

答案 7 :(得分:-3)

为什么要用bc?

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

唯一的问题:比较&#34;&lt;&#34;不使用负数:它们被视为绝对值。