我的文件如下:
-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
答案 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
,因为通常应避免使用大写变量名。