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



我想根据日期和帐户聚合文件每行上存在的json。可能有多个具有相同日期和帐户的记录,我们必须根据日期和account_no聚合计数。

示例文件:

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

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

使用

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变体,例如节省空间,并避免恢复两个"聚合依据"字符串的潜在解析问题:

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"对于大型数组有一个明显的潜在缺点:它使用排序算法。

相关内容

最新更新