【问题标题】:Use Awk to sum all cells in a csv使用 awk 对 csv 中的所有单元格求和
【发布时间】:2020-07-19 12:22:01
【问题描述】:

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

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

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

任何帮助将不胜感激!

【问题讨论】:

  • 你想要什么输出?一个数字,总和?或者一行包含每列的总和和总和?网上有很多例子说明如何做到这一点,如何对一列中的所有数字求和和/或如何对一行中的所有数字求和。
  • 您好,谢谢!我希望输出是一个 csv 文件,有 1 行和 84 列,其中每列是一个数字,计算为列总和/总和。

标签: csv awk arithmetic-expressions


【解决方案1】:

如果所需的最终输出只是一个单行 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 矩阵;此代码也适用于此类矩阵。矩阵不必是正方形的。输入数据甚至不必在每行中具有相同数量的字段。您可以添加验证以坚持任一条件,或两者兼而有之。如果您需要中间结果文件,您也可以安排此代码生成它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2014-10-29
    • 2013-02-04
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多