比较unix中的浮点数

时间:2015-01-23 13:35:30

标签: unix floating

我在比较unix

中的大浮动变量时遇到了问题

代码: 错误消息:第1行电传打字机上的语法错误 我从论坛的一篇旧帖子中了解到这是因为 "脚本试图通过将表达式回显到bc来进行计算。但其中一个变量有一个非法数字"

以下是给出错误的脚本

代码:

#! /bin/bash -xv
a=`cat abc.csv  | sed '1d' | tr -s ' ' | cut -d, -f3`
echo $a 
-180582621617.24

b=`sed '1d' def.csv | cut -d',' -f7 | awk '{s+=$1}END{ printf("%.2f\n",s)}'`
echo $b
-180582621617.37

Result=`echo "if($a !=$b) 1" | bc `

if [ $Result -eq 1 ]; then
echo "both values not equal"
else
echo " both values equal"
fi

但我能够在硬编码时对它进行比较

代码:

a=`echo "-180582621617.24,222.555,333.333" | awk -F"," '{print $1}'`
b=`echo "-180582621617.24,222.555,333.333" | awk -F"," '{print $1}'`

Result=`echo "if($a !=$b) 1" | bc `

if [ $Result -eq 1 ]; then
echo "both values not equal"
else
echo " both values equal"
fi

3 个答案:

答案 0 :(得分:1)

bc中的测试如果为真,则返回1,如果为假,则返回任何内容。

$Result将是未定义的或数字的(1)。 test -eq仅适用于两个数字操作数。只需为else案例

返回0
Result=`echo "if($a !=$b) 1 else 0" | bc `
if [ $Result -eq 1 ] ; then
    echo "both values not equal"
else
    echo " both values equal"
fi

答案 1 :(得分:0)

使用bc处理shell中的浮点数:

$ bc <<< '-180582621617.24 == -180582621617.37'
0
$ bc <<< '-180582621617.24 != -180582621617.37'
1

在您的情况下,它将是bc <<< "$a != $b",例如:

[[ bc <<< "$a != $b" ]] && Result=1 || Result=0

答案 2 :(得分:0)

感谢所有建议。

我能够通过创建两个临时文件并使用diff -w命令进行比较。

#! /bin/bash -xv
rm -f triger_cksum.txt data_cksum.txt
a=`cat ab.csv | sed '1d' | tr -s ' ' | cut -d, -f3`
echo $a > triger_cksum.txt
b=`sed '1d' cd.csv | cut -d',' -f61 | awk '{s+=$1}END{ printf("%.6f\n",s)}'`
echo $b > data_cksum.txt
diff_files=`diff -w triger_cksum.txt data_cksum.txt | wc -l | tr -s ' '`
if [ $diff_files -eq 0 ]
then
echo "cksum equal"
else
echo "cksum not equal"
fi