文件之间的算术运算

dov*_*vah 5 text-processing arithmetic

假设我有这两个输入文件:

> file1
2
3
4

> file2
10
100
1000
Run Code Online (Sandbox Code Playgroud)

我想为每一行计算:file1/file2,结果是file3:

> file 3
0.2
0.03
0.004
Run Code Online (Sandbox Code Playgroud)

bash 中的划分可以通过以下方式实现: $((file1_line/file2_line))

Tho*_*hor 11

A pasteandbc组合是简单算术的不错选择:

paste -d/ file1 file2 | bc -l
Run Code Online (Sandbox Code Playgroud)

输出:

.2000000000
.0300000000
.0040000000
Run Code Online (Sandbox Code Playgroud)

更高级的例子

通过一些技巧,您可能会变得更加复杂。说file3包含:

6
7
8
Run Code Online (Sandbox Code Playgroud)

你可以这样做(file1 + file3) / file2

paste -d'(+)/' /dev/null file1 file3 /dev/null file2
Run Code Online (Sandbox Code Playgroud)

输出:

(2+6)/10
(3+7)/100
(4+8)/1000
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为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
Run Code Online (Sandbox Code Playgroud)

或者如果有任何错误:

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
Run Code Online (Sandbox Code Playgroud)


Arc*_*mar 7

从...开始

 paste file1 file2 | awk '{printf "%f\n",$1/$2 } '
Run Code Online (Sandbox Code Playgroud)

在哪里

  • paste 将“合并”文件
  • awk 将计算除法,一次一个。

如果您不喜欢太多的尾随 0,只需添加

... | sed -e s/0*\$//
Run Code Online (Sandbox Code Playgroud)

退出的情况下 0

paste file1 file2 | awk '!$2 {exit ; }  {printf "%f\n",$1/$2 } '
Run Code Online (Sandbox Code Playgroud)