计算并删除jq

时间:2017-10-19 11:37:57

标签: json jq

我有一个对象数组,我想删除这个数组中的一些副本,但是我想保留重复项的数量。

我的意见是:

[
    {
        "foo": 1,
        "bar": "a",
        "baz": "whatever"
    },
    {
        "foo": 1,
        "bar": "a",
        "baz": "hello"
    },
    {
        "foo": 1,
        "bar": "b",
        "baz": "world"
    }
]

(不确定它是否重要,但对象的唯一性基于foobar,而不是baz

所需输出的一个例子是:

[
    {
        "foo": 1,
        "bar": "a",
        "baz": "whatever",
        "count": 2
    },
    {
        "foo": 1,
        "bar": "b",
        "baz": "world",
        "count": 1
    }
]

甚至:

[
    {
        "count": 2,
        "data": {
            "foo": 1,
            "bar": "a",
            "baz": "whatever"
        }
    },
    ...
]

我知道如何处理唯一性部分(使用unique_by([.foo, .bar]))但不知道计数部分。

2 个答案:

答案 0 :(得分:1)

您可以使用基于group_by(.foo,.bar) | map(.[]+{"count":length}) | unique_by(.foo,.bar) 的以下命令:

[
  {
    "foo": 1,
    "bar": "a",
    "baz": "whatever",
    "count": 2
  },
  {
    "foo": 1,
    "bar": "b",
    "baz": "world",
    "count": 1
  }
]

输出:

group_by(.foo,.bar)
| map({"count":length,"data":(unique_by(.foo,.bar)[])})

您提到的其他输出可以使用以下命令实现:

[
  {
    "count": 2,
    "data": {
      "foo": 1,
      "bar": "a",
      "baz": "whatever"
    }
  },
  {
    "count": 1,
    "data": {
      "foo": 1,
      "bar": "b",
      "baz": "world"
    }
  }
]

输出:

{{1}}

答案 1 :(得分:1)

以下解决方案使用peakGROUPS_BY代替group_by/1来避免排序:

def GROUPS_BY(stream; f): reduce stream as $x ({}; .[$x|f] += [$x] ) | .[] ;

  GROUPS_BY(.[]; {foo,bar}|tostring)
| .[0].count = length
| .[0]