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

2024-05-27 15:57:37 浏览数 (2)

更多好文请关注↑

问题

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

例如文件 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

0 人点赞