使用 Awk 对 csv 中的所有单元格求和

Use Awk to sum all cells in a csv

我有一堆 csv 文件,每个文件都是一个 84 x 84 的数字矩阵。我正在尝试使用 awk 对所有单元格求和(以生成一个数字)。到目前为止,我所能想到的只是以下内容,它可以一次对单个列(例如,第 75 列)求和,但不能将所有列加在一起:

awk -F ',' '{sum += } END {print sum}' file_name.csv

然后,我想在同一目录中创建一个新的 csv 文件,其中每一列都是前一个 csv 中该列的总和除以前一个 awk 命令生成的总和。所以换句话说,一个只有 1 行的 csv,其中每一列都有一个数字,即列 sum/total 总和。

非常感谢任何帮助!

如果所需的最终输出只是一个单行 CSV 文件,其中列总和除以输入中每一列的总和,那么这应该用一个 awk 命令完成.

{
    for (i = 1; i <= NF; i++)
    {
        colsum[i] += $i
        totsum += $i
        if (NF > maxfld)
            maxfld = NF
    }
}
END {
    pad = ""
    for (i = 1; i <= maxfld; i++)
    {
        printf("%s%.2f", pad, colsum[i] / totsum)
        pad = ","
    }
    print ""
        
}

我会将其存储在 script.awk 和 运行 等文件中:

awk -F, -f script.awk data

给定样本输入(8 行 8 列)— 一组 10 到 99 之间的随机数:

34,98,18,16,62,86,21,37
39,10,62,33,81,16,70,36
23,23,56,16,86,82,30,74
18,10,42,46,99,93,83,76
90,10,76,50,12,24,13,96
11,40,89,92,31,71,25,90
87,82,33,24,32,25,98,17
86,50,70,33,93,30,98,67

输出是:

0.12,0.10,0.13,0.09,0.15,0.13,0.13,0.15

显然,您可以调整用于显示最终值的格式;我选择了 2 位小数,但你可以选择任何你喜欢的格式。

题目问的是84x84的矩阵;此代码也适用于此类矩阵。矩阵不必是正方形的。输入数据甚至不必在每一行中具有相同数量的字段。您可以添加验证以坚持任一条件或两者。如果您需要中间结果文件,您也可以安排此代码生成它们。