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

21 bash shell awk

我想比较两个十进制值,但我收到错误.我用了

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

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

我收到了错误.

这是怎样的正确方法?

Pau*_*ce. 38

你可以使用Bash的数字上下文来做到这一点:

if (( $(echo "$result1 > $result2" | bc -l) )); then
Run Code Online (Sandbox Code Playgroud)

bc将输出0或1,(( ))它们将分别解释为false或true.

使用AWK同样的事情:

if (( $(echo "$result1 $result2" | awk '{print ($1 > $2)}') )); then
Run Code Online (Sandbox Code Playgroud)

  • 对于awk解决方案+1,但是:`if echo $ result1 $ result2 | awk'{exit!($ 1> $ 2)}'; 然后......` (11认同)

小智 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
Run Code Online (Sandbox Code Playgroud)


Sam*_*mir 5

跟进丹尼斯的回复:

尽管他的回复对于小数点是正确的,但 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
Run Code Online (Sandbox Code Playgroud)

尽管退出代码为 0,但这会返回错误的输出并带有警告。

(standard_in) 1:语法错误
r1 < r2

虽然对此没有明确的解决方案(讨论线程 1线程 2awk ),但我使用了以下部分修复方法,即使用bcDennis 的回复和该线程中的命令对浮点结果进行四舍五入

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

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

然后,您可以像上面一样使用 bash 算术,或者[[ ]]下面的线程一样使用封装。

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

或使用-eq运算符,其中bc1 的输出为true,0 为false

if [[ $(bc <<< "$result1 < $result2") -eq 1 ]]; then
    echo "r1 < r2"
else
    echo "r1 > r2"
fi
Run Code Online (Sandbox Code Playgroud)


小智 5

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