在同一文件中合并多个json数组

时间:2015-02-12 08:01:25

标签: bash jq

我目前正在下载大量的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值
  3. 中删除T09:01:23.000+0200
  4. 计算具有特定日期值的对象数,例如2014-10-13

2 个答案:

答案 0 :(得分:1)

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

由于日期都是某种固定格式,您可以获取日期的子字符串。

"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

答案 1 :(得分:1)

对于问题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