更多好文请关注↑
问题
有上万行(甚至更多)不断递增的浮点数(每行一个),怎么将它们每四个一组计算每组第四个和第一个之间的差值,并打印输出计算结果?
例如文件 data 有以下数据:
代码语言:javascript复制2.699350
2.699359
2.699940
2.699946
3.075009
3.075016
3.075111
3.075118
执行脚本处理文件后有如下输出:
代码语言:javascript复制$ bash calc.sh data
2.699946 - 2.699350 = 0.000596
3.075118 - 3.075009 = 0.000109
问题是如何编写实现这个 shell 脚本 calc.sh ?
回答
处理大量数据并以特定模式(比如每四个一组)进行计算时,可以利用 awk 的强大功能。
我们可以编写一个 awk 脚本,代码如下:
代码语言:javascript复制{
# 存储当前行的浮点数到数组
numbers[NR] = $1
# 每收集满四个数进行处理
if (NR % 4 == 0) {
# 获取当前组的第一个和最后一个数
first_num = numbers[NR-3]
last_num = numbers[NR]
# 计算差值
diff = last_num - first_num
# 打印算式和差值
printf "%.6f - %.6f = %.6fn", last_num, first_num, diff
}
}
将代码保存为 calc.awk 文件,然后在 Linux 终端执行如下命令:
代码语言:javascript复制cat data | awk -f calc.awk
测试效果如下:
参考
- man awk