利用 AWK 的数值计算功能提升工作效率(3) 验证通量:从多个文件中提取数据并计算
- UID
- 1066743
|
利用 AWK 的数值计算功能提升工作效率(3) 验证通量:从多个文件中提取数据并计算
实例2: 验证通量:从多个文件中提取数据并计算这个例子是通过计算不同位置处的流体的通量来验证它们是否相同。 这里的通量可视为某个截面上通过的颗粒浓度, 流体的速度和截面面积的乘积。 现在的问题是浓度, 速度等参数分布在不同的数据文件中, 而这些文件是字符和数据共存的, 比如包含浓度的文件 simu_space_1.dat 有如下的格式:
清单 10. 数据文件 simu_space_1.dat 的格式
{0.436737, 0.429223, 3.000000, 1.000000, 43300806482080792.000000, 243231808.137785},
{1.296425, 0.429223, 3.000000, 1.000000, 107468809895964656.000000, 584622938.047805},
{2.128973, 0.429223, 3.000000, 1.000000, 102324821165926400.000000, 539067822.351442},
......
{19.358569, 4.875000, 3.000000, 1.000000, 257544788738191712.000000, 1460324590.999991},
{19.620925, 4.875000, 3.000000, 1.000000, 266676357086157504.000000, 1464352706.940682},
{19.875000, 4.875000, 3.000000, 1.000000, 260249342336872224.000000, 1383971975.659338},
第一步当然是从上面的文件中把某个位置上的浓度数据 (每一行左起第五个数字) 提取出来。 下面的 awk 代码是把位置 x = 0.429223 处的浓度提取出来, 并保存到一个临时文件 number.txt 中:
清单 11. 提取指定位置处的数据并保存1
2
| awk -F'{|,\t|},' '{for(i=1; i<NF; i++) {if($i~/0.429223/) print $(i+3)}}' \
simu_space_1.dat > number.txt
|
现在文件 number.txt 中有了一列浓度数据。 接着我们从其他文件中提取在同一位置处的速度和面积的数据, 然后把它们分别保存到临时文件 velocity.txt 和 area.txt 中。 然后把三个临时文件中的数据合并到另一个文件 flux.txt 中以方便 awk 的计算。 这个合并操作可以用工具 paste 来轻松完成, 代码如清单 12:
清单 12. 合并不同文件中的数据到一个文件1
| paste number.txt velocity.txt area.txt > flux.txt
|
现在 flux.txt 中包含了三列数据, 分别是浓度,速度和面积。 按照前面介绍的通量计算方法, 文件 flux.txt 中每一行的三个数据要首先相乘, 然后再把所有的乘积加起来就可以得到通过那个截面的通量了, 具体的代码见清单13:
清单 13. 计算通量的 awk 代码1
| awk '{x=x+($1*$2*$3)} END {print x}' flux.txt
|
上面的代码使用了一个变量 x, 第一次执行时, x 被赋予文件 flux.txt 中第一行三个数据的乘积。 第二次执行时, 它保留了第一次计算的值并加上第二行三个数据的乘积, 以此类推, 直到达到累计的总合。 END 的作用是只显示最后的结果, 而不显示中间的累加结果。 我们可以做一个比较, 以前我们是利用其他的软件 (比如 Excel 或者 OpenOffice Calc) 来计算通量的。 这必然要涉及到导入数据, 选择相应的计算函数等一系列的操作, 而用 awk 只要一行代码! 如果再考虑到计算之前从不同文件中提取数据的工作也是由 awk 完成的 (其实也就是几行代码), 所以对本例而言使用 awk 节约了可观的时间。 |
|
|
|
|
|