通过算术运算修改文件中的浮点数(正数和负数)

时间:2015-09-07 14:42:44

标签: shell if-statement floating-point numbers

我的文件如下:

-180.0564
-179.0857
178.4739

我需要浏览整个文件并仅更改正(或负)值减去100之类的整数或在我的情况下减去360。 我在Web上开发此代码,并使用bc命令进行浮动操作。

问题在于现在正在改变所有负值而不是正值,我无法理解为什么。

以下是代码:

#!/bin/bash

FILE=$1

while read line;do

 if [ $(echo $line '>' 0.0 |bc -l) ]; then

    line=$(echo "$line-360" |bc)
    echo $line

    else

    echo $line
fi

done < $FILE

2 个答案:

答案 0 :(得分:0)

这是因为[](实际上是程序test)旨在测试 returncode - 如果程序成功结束则为零。

$ [ 0 ] && echo ok || echo err
ok

至于你的计算,我会用 modulo 删掉一个bc电话。

$ while read line; do bc <<< "($line-360)%360"; done < $FILE
-180.0564
-179.0857
-181.5261

答案 1 :(得分:0)

对于涉及处理线的任何任务,值得考虑使用awk:

awk '{ print ($0 > 0 ? $0 - 360 : $0) }' "$file"

此代码替换了整个while read循环。在awk中,$0指的是每行的内容。逻辑与代码中的逻辑相同:如果行大于0,则减去360,否则保持原样。

使用awk编写相同内容的较短方法是:

awk '$0 > 0 { $0 -= 360 }1' "$file"

awk程序的结构是condition { action },因此逻辑与上面相同。此版本使用常见的简写1,这是最短的条件,始终是真的。默认操作是{ print },它打印整行。

这些选项中的任何一个都会更快,因为他们不会调用外部进程,因为awk反正比while read快。更重要的是,它们也更短,更容易阅读。

请注意,我使用$file而非$FILE,因为通常应避免使用大写变量名。