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

Modify through arithmetic operations floating point numbers (positive and negative) in a file

我有一个这样列出的文件:

-180.0564
-179.0857
178.4739

我需要查看整个文件并仅更改正(或负)值减去一个整数,如 100 或在我的情况下为 360。 我在网上开发了这段代码,我正在使用 bc 命令进行浮动操作。

问题是现在正在更改所有负值而不是正值,我不明白为什么。

代码如下:

#!/bin/bash

FILE=

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

这是因为 [](实际上是程序 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

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

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

此代码将替换整个 while read 循环。在awk中,[=13=]指的是每一行的内容。逻辑和你的代码一样:如果直线大于0,则减去360,否则保持原样。

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

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

awk程序的结构是condition { action },所以逻辑和上面一样。此版本使用常见的 shorthand 1,这是始终为真的最短条件。默认操作是 { print },打印整行。

这些选项中的任何一个都会更快,因为它们不调用外部进程,而且 awk 无论如何都比 while read 快。更重要的是,它们也更短且更易于阅读。

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