利用 awk 定制化处理大量数据的计算

更多好文请关注↑

问题

有上万行(甚至更多)不断递增的浮点数(每行一个),怎么将它们每四个一组计算每组第四个和第一个之间的差值,并打印输出计算结果?

例如文件 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 = %.6f\n", last_num, first_num, diff
}

}

将代码保存为 calc.awk 文件,然后在 Linux 终端执行如下命令:

代码语言:javascript
复制
cat data | awk -f calc.awk

测试效果如下:

参考

  • man awk