在 csv 中聚合数据

Aggregating data in a csv

我必须生成一个 HTML 文件来显示我如何在 csv 文件中汇总数据。

这个文件的结构如下:

num_expediente;fecha;hora;localizacion;numero;cod_distrito;distrito;tipo_accidente;estado_meteorológico;tipo_vehiculo;tipo_persona;rango_edad;sexo;cod_lesividad;lesividad;coordenada_x_utm;coordenada_y_utm;positiva_alcohol;coste;positiva_droga
2022S000001;Enero;Noche;AVENIDA ALBUFERA;19;13;13_PUENTE DE VALLECAS;Choque;Despejado;Vehículo ligero;Conductor;<30;Mujer;0;Sin asistencia;443359,226;4472082,272;0;0;0
2022S000002;Enero;Noche;PLAZA CANOVAS DEL CASTILLO;2;3;3_RETIRO;Choque;Desconocido;Motocicleta;Conductor;31_60;Hombre;0;Sin asistencia;441155,351;4474129,588;1;0;0
2022S000003;Enero;Noche;CALLE SAN BERNARDO;53;1;1_CENTRO;Atropello;Despejado;Motocicleta;Conductor;Desconocido;Desconocido;0;Sin asistencia;439995,351;4475212,523;0;0;0
2022S000004;Enero;Noche;CALLE ALCALA;728;20;20_SAN BLAS-CANILLEJAS;Choque;Despejado;Vehículo ligero;Conductor;31_60;Hombre;2;Leve;449693,925;4477837,552;0;200;0
2022S000004;Enero;Noche;CALLE ALCALA;728;20;20_SAN BLAS-CANILLEJAS;Choque;Despejado;Vehículo ligero;Pasajero;31_60;Mujer;3;Grave;449693,925;4477837,552;0;3000;0

num_expediente是意外的id fecha是出事的月份 sexo是事故隐含的人的性别 coste 是隐含的人的事故成本

我想创建一个 table 来显示每月的累计费用和性别。我使用这个脚本:

#! /usr/bin/awk -f
BEGIN {FS=OFS=";"}
function loop(array, name, i) {
    for (i in array) {
        if (isarray(array[i]))
            loop(array[i], (name "[" i "]"))
        else
            printf("%s[%s] = %s\n",name, i, arr[i])
        }
}
NR!=1{
    array[][]+=
}
END {loop(array, "")
}

但输出并未汇总成本:

[Enero][Hombre] = 
[Enero][Desconocido] = 
[Enero][Mujer] = 
[Febrero][Hombre] = 
[Febrero][Mujer] = 
[Febrero][Desconocido] = 
[Marzo][Hombre] = 
[Marzo][Desconocido] = 
[Marzo][Mujer] = 

我不知道为什么这不起作用。 我不知道如何从这个输出中生成 html。你也能帮忙吗?

如评论中所述,OP 在 printf 中有错字,其中 arr[i] 应为 array[i];虽然这应该可以解决 OP 当前的问题,但我不确定我是否理解递归函数调用的使用,除非 OP 的现实世界问题是处理不同维度的数组。

由于我们处理的是已知维度(即 2)的数组,因此简化了 awk 想法:

awk -F';' '
NR>1 { array[][]+= }
END  { for (month in array)
           for (gender in array[month])
               printf "[%s][%s] = %s\n", month, gender, array[month][gender]
     }
' raw.csv

对于提供的输入,生成:

[Enero][Hombre] = 200
[Enero][Desconocido] = 0
[Enero][Mujer] = 3000

备注:

  • 此解决方案不解决 OP 可能对输出的任何排序要求
  • 对于额外的排序要求,我建议 OP 首先解决当前问题,一旦解决,然后尝试应用额外的排序要求,然后...
  • 如果排序有问题,请提出一个新问题(确保包括月份和性别的完整列表以及两个组件所需的排序顺序)