假设我有这两个输入文件:
> file1
2
3
4
> file2
10
100
1000
我想计算:每一行的 file1/file2,结果是 file3:
> file 3
0.2
0.03
0.004
bash 中的除法可以通过以下方式实现:$((file1_line/file2_line))
答案1
Apaste
和 的bc
组合是简单算术的不错选择:
paste -d/ file1 file2 | bc -l
输出:
.2000000000
.0300000000
.0040000000
一个更高级的例子
通过一些技巧,你可能会变得更加复杂。说file3
包含:
6
7
8
你可以(file1 + file3) / file2
这样做:
paste -d'(+)/' /dev/null file1 file3 /dev/null file2
输出:
(2+6)/10
(3+7)/100
(4+8)/1000
这是有效的,因为paste
循环遍历每行的分隔符列表。
对除零的反应
发送的非法操作会bc
导致向标准错误发送警告。您可以将它们重定向到不同的文件并根据其内容决定程序流程,例如:
paste -d/ file1 file2 | bc -l > resultfile 2> errorfile
if grep -q 'Divide by zero' errorfile; then
echo "Error in calculation"
else
echo "All is well"
fi
或者如果有任何错误:
paste -d/ file1 file2 | bc -l > resultfile 2> errorfile
if ! file errorfile | grep -q empty; then
echo "Error in calculation"
else
echo "All is well"
fi
答案2
从...开始
paste file1 file2 | awk '{printf "%f\n",$1/$2 } '
在哪里
paste
将“合并”文件awk
将计算除法,一次一个。
如果您不喜欢太多尾随 0,只需添加
... | sed -e s/0*\$//
在以下情况下退出0
paste file1 file2 | awk '!$2 {exit ; } {printf "%f\n",$1/$2 } '