我想使用jq处理每行包含json对象的大文件

时间:2019-07-11 09:55:28

标签: json group-by aggregate jq

我想根据日期和帐户汇总文件每一行上的json。可能有多个记录具有相同的日期和帐户,我们必须基于date和account_no汇总计数。

示例文件:

{"date":"2019-04-01","count":0,"account_no":"1591"}
{"date":"2019-04-01","count":1,"account_no":"1592"}

请提出一些解决方案。 文件中的json数几乎为2.5cr

1 个答案:

答案 0 :(得分:1)

使用inputs进行jq是个好方法。

首先,这是一个面向流的通用sigma_by函数:

# In this formulation, f must either always evaluate to a string or
# always to an integer, it being understood that negative integers
# might be problematic
def sigma_by(s; f; g):
  reduce s as $x  (null; .[$x|f] += ($x|g));

然后可以通过以下方法实现解决方案:

sigma_by(inputs; "\(.date):\(.account_no)"; .count)

使用了-n命令行选项。

输出

使用示例输入,输出将是:

{
  "2019-04-01:1591": 0,
  "2019-04-01:1592": 1
}

变化

不用说,有很多可能的变化。特别是,可以保证使用字典的sigma_by变体,例如以节省空间,并避免潜在的解析问题来恢复两个“ agregation by”字符串:

def sigma_by(s; a; b; g):
  reduce s as $x  (null; .[$x|a][$x|b] += ($x|g));

sigma_by(inputs; .date; .account_no; .count)

请注意,jq的内置“ group_by”对于大型数组具有明显的潜在缺点:它使用排序算法。