通过算术运算修改文件中的浮点数(正数和负数)
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
,因为通常应避免使用大写变量名称。
我有一个这样列出的文件:
-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
,因为通常应避免使用大写变量名称。