【问题标题】:Merging multiple json arrays in the same file在同一个文件中合并多个 json 数组
【发布时间】:2015-02-12 08:01:25
【问题描述】:

我目前正在下载大量 jira 问题以生成报告。目前,“完整数据”文件有大量单独的记录,如下所示:

{
    "key": "645",
    "type": "Bug",
    "typeid": "1",
    "status": "Closed",
    "summary": "Crash when saving document",
    "closedDate": "2014-10-03T09:01:23.000+0200",
    "flag": null,
    "fixVersionID": "123",
    "fixVersionName": "2.7"
}

但是,因为我要下载多个版本并附加到同一个文件,所以我最终会得到这种结构。

[
  {
    "key": "645",
    "type": "Bug",
    "typeid": "1",
    "status": "Closed",
    "summary": "Crash when saving document",
    "closedDate": "2014-10-03T09:01:23.000+0200",
    "flag": null,
    "fixVersionID": "123",
    "fixVersionName": "2.7"
  }
]
[
  {
    "key": "552",
    "type": "Bug",
    "typeid": "1",
    "status": "Closed",
    "summary": "Graphical Issue",
    "closedDate": "2014-10-13T09:01:23.000+0200",
    "flag": null,
    "fixVersionID": "456",
    "fixVersionName": "2.8"
  }
]

我想要做的是计算具有特定日期的记录数,然后使用 jq 在开始日期到结束日期之间进行相同的循环

但是,我不知道该怎么做:

  1. 将记录展平,使它们成为一个数组而不是两个数组
  2. 从 closedDate 值中去除 T09:01:23.000+0200
  3. 统计具有特定日期值的对象数,例如2014-10-13

【问题讨论】:

  • 实际上,我想出了如何剥离T09:01:23.000+0200。当您映射 jira 问题时,请执行以下操作:map({closedDate: .fields.resolutiondate[0:10]}) 这只会给您前十个字符。
  • grep '2014-10-13' some.json | wc -l 会不会不够计数?
  • @pratZ 会的,但我想要一个更清洁的解决方案。我知道 jq 有一个 max 和一个 min 函数,并且正在寻找类似的东西。但是,如果 grep 做到了,那就这样吧。真正的问题是数组的扁平化。

标签: bash jq


【解决方案1】:

您有多个独立的输入。为了能够以任何有意义的方式将它们组合起来,您必须大量输入。输入将被视为输入数组。然后你可以通过adding 将它们组合成一个数组。

由于日期都采用某种固定格式,因此您可以取日期的子字符串。

"2014-10-13T09:01:23.000+0200"[:10] -> "2014-10-13"

鉴于此,您可以使用length 过滤器按您想要的日期和计数进行过滤。

add | map(select(.closedDate[:10]=="2014-10-13")) | length

例如,

$ cat input.json
[
  {
    "key": "645",
    "type": "Bug",
    "typeid": "1",
    "status": "Closed",
    "summary": "Crash when saving document",
    "closedDate": "2014-10-03T09:01:23.000+0200",
    "flag": null,
    "fixVersionID": "123",
    "fixVersionName": "2.7"
  }
]
[
  {
    "key": "552",
    "type": "Bug",
    "typeid": "1",
    "status": "Closed",
    "summary": "Graphical Issue",
    "closedDate": "2014-10-13T09:01:23.000+0200",
    "flag": null,
    "fixVersionID": "456",
    "fixVersionName": "2.8"
  }
]
$ jq -s 'add | map(select(.closedDate[:10]=="2014-10-13")) | length' input.json
1

【讨论】:

  • 嗯,根据需要插入所需的输入方法。对于文件,是的,没用,但我不知道实际来源是什么,但不管它是什么,它可能都可以通过管道输入。
  • @JeffMercado 输入源是对 jira 的 curl 调用,它对检索到的对象数量有上限。所以我必须进行顺序调用并将它们写入文件。我希望我知道为什么那没用。对我来说似乎很有用!
  • @TheMightyLlama:搜索“UUOC”。这个想法是使用cat 管道到另一个进程是对`cat.最好改为重定向或使用其他形式的输入。我个人觉得它的使用没有问题。
【解决方案2】:

对于问题 1 和 2:

$ echo -e "[\n$(sed '/^[][]$/d;/closedDate/s/\(T[^"]*\)//g' json)\n]" > flat-json

统计特殊日子的人数:

$ grep "closedDate" flat-json | grep "2014-10-13" | wc -l

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2017-09-25
    • 1970-01-01
    • 2019-12-16
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多