标签: floating-point

错误:预期的整数表达式

我编写了一个脚本来确定服务器上的平均负载,如下所示:

#!/bin/bash

loadavg=`top -b -n1 | grep -i load | awk -F, '{print$4}'| awk -F: '{print $2}'`

if [ "${loadavg}" -le  1 ]
then
echo "OK - Load Average = ${loadavg} | Load_Average=${loadavg}"
exit 0;
elif [ "${loadavg}" -gt 1 ] && [ "${loadavg}" -le 2 ]
then
echo "WARNING - Load Average = ${loadavg} | Load_Average=${loadavg}"
exit 1;
elif [ "${loadavg}" -gt 2 ]
then
echo "CRITICAL - Load Average = ${loadavg} | Load_Average=${loadavg}"
exit 2;
else
echo "UNKNOWN …
Run Code Online (Sandbox Code Playgroud)

bash shell-script arithmetic floating-point

2
推荐指数
1
解决办法
5489
查看次数

在 SED 语句中格式化浮点变量

作为 makefile 配方的一部分,我想重复调整一些文本文件中的几行txt.in。特别是,我想更新第三行,其中仅包含两个由空格分隔的数字。它们的格式应为0.00 0.00. 因此,我已将以下代码包含在我的 makefile 中以测试我是否可以执行此操作。

# Makefile to test for-loop
SHELL=/bin/zsh

for:
    for k in 1 2 3; do \
        let n="$$k*0.25"; \
        let m="$$n+0.25"; \
        sed -i "3s/.*/$$n $$m/" txt.in; \
    done
Run Code Online (Sandbox Code Playgroud)

0.7500000000 1.0000000000就是最终结果。可能有更有效的方法来做到这一点,我很乐意找到这些方法,但我真正想知道的是是否有办法使格式正确。

sed floating-point

2
推荐指数
1
解决办法
1390
查看次数

如何用 BASH 减去从其他 2 个文件中提取的 2 个浮点数

我试图找出我从两个文件中获取的两个数字之间的差异。我认为我的代码会有意义:

我试图通过两种不同的方法使其工作,但没有奏效。我得到的输出是零 (0)。

#method 1
difference_btwn_eng_hrs_MX3_122=$(($(sed -n '1p' engine_hours_new_MX3_122.txt)-$(sed -n '1p' engine_hours_old_MX3_122.txt)))
echo "$difference_btwn_eng_hrs_MX3_122"

#method 2
new=$(sed -n '1p' engine_hours_new_MX3_122.txt)
old=$(sed -n '1p' engine_hours_old_MX3_122.txt)
echo "$new $old" | awk '{print $new - $old}'
Run Code Online (Sandbox Code Playgroud)

最终我将使用差异来设置电子邮件更新的间隔。

文件里面的值分别是511.786(新)和509.768(旧),我从终端得到的错误如下:

line 40: 511.786-509.765: syntax error: invalid arithmetic operator (error token is ".786-509.765")
Run Code Online (Sandbox Code Playgroud)

bash shell-script arithmetic floating-point

2
推荐指数
1
解决办法
1万
查看次数

在awk中将指数表示法转换为十进制数

我有空格分隔的文件。该文件包含指数格式的文本和数字。我想将指数数转换为实际的十进制值。有人可以建议我如何实现这一目标吗?

awk floating-point

2
推荐指数
1
解决办法
4033
查看次数

检查十进制数是否在 bc 的范围内

我已经写了这个 if ,这显然不起作用,而且我仍然无法克服它:

#LASTEFFECTIVEHASH
if (( $(echo "$LASTEFFECTIVEHASHMINVAL < $LASTEFFECTIVEHASH < $LASTEFFECTIVEHASHMAXVAL" | $BC -l) )); then
                echo "$DATESTAMP - LASTEFFECTIVEHASH=$LASTEFFECTIVEHASH is between $LASTEFFECTIVEHASHMINVAL and $LASTEFFECTIVEHASHMAXVAL"|tee -a $LOGFILE
else
                echo "$DATESTAMP - LASTEFFECTIVEHASH=$LASTEFFECTIVEHASH is not between $LASTEFFECTIVEHASHMINVAL and $LASTEFFECTIVEHASHMAXVAL"|tee -a $MSGFILE $LOGFILE
fi
Run Code Online (Sandbox Code Playgroud)

但是,当值超出范围时,会导致以下结果:

20170810003646 - LASTEFFECTIVEHASH=139.2 is between 104.9 and 136.9
Run Code Online (Sandbox Code Playgroud)

我遵循数学语法:如果 x > 104.9 且 < 136.9,则在数学中写为104.9 < x < 136.9。但我怀疑 bash/bc 的行为与我的数学老师不同。

如果 bc 不会数到 137 就太好了;)

shell-script bc math floating-point

1
推荐指数
1
解决办法
1007
查看次数

bash 中的浮点数

假设我有一个变量,我想在将其乘以 1000 后打印 5 位有效数字。zsh可以这样做:

zsh$ x=2.8026407e+00
zsh$ printf "%.5g\n" "$(( 1000*${x} ))"
zsh> 2802.6
Run Code Online (Sandbox Code Playgroud)

bash也能做到吗?

bash$ x=2.8026407e+00
bash$ printf "%.5g\n" "$(( 1000*${x} ))"
bash> bash: 1000*2.8026407e+00 : syntax error: invalid arithmetic operator (error token is ".8026407e+00 ")
Run Code Online (Sandbox Code Playgroud)

我认为没有办法让原生 bash 理解浮点运算,是吗?我知道我可以使用 eg awk,但我想知道是否bash可以这样做。

(我并不惊讶bash不能处理浮动,但zsh可以!)

bash zsh floating-point

1
推荐指数
1
解决办法
8651
查看次数

将 bash 循环索引转换为浮点数

我需要i在循环中使用索引,例如for i in {0..10..5}在浮点计算中。将 i 转换为浮点数的最简单方法是什么?
变体

i=$(bc -l <<< "scale=7;$i")
Run Code Online (Sandbox Code Playgroud)

不工作。

shell-script floating-point

0
推荐指数
1
解决办法
667
查看次数

如何缩短bash中的十进制输出?

现在我正在做一项涉及高级管道的作业,其中一个问题涉及计算百分比并将其缩短到小数点后三位。我已经成功计算了百分比:

echo "$ERRORS" / "$TOTAL" \* 100 | bc -l

这给出了正确的输出:2.64905226881102814400

ERRORS 和 TOTAL 都是包含整数的环境变量。

但我真的不知道如何修改此命令以仅输出 2.649 而不是完整的数字。我知道有一种方法可以使用 bc 中的“scale”来缩短到一定数量的小数位,但我尝试过,echo scale=3; "$ERRORS" / "$TOTAL" \* 100 | bc -l但没有成功。

我究竟做错了什么?

pipe bc floating-point

0
推荐指数
1
解决办法
176
查看次数

标签 统计

floating-point ×8

shell-script ×4

bash ×3

arithmetic ×2

bc ×2

awk ×1

math ×1

pipe ×1

sed ×1

zsh ×1