首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JQ获取终端唯一值并按键过滤

JQ获取终端唯一值并按键过滤
EN

Stack Overflow用户
提问于 2018-07-17 05:53:18
回答 1查看 152关注 0票数 0

我正在发现jq,它是令人惊叹的东西。在GitHub上发布了一些,他们告诉我在这里发布使用问题。

我正在尝试从json和过滤器获取键/值的列表,以保持属于列表/数组的每个键的唯一值。输入json为

{
"key0": {
"key1": "valueA",
"key2": 123456,
"key3": [{
  "key4": "anotherValue41",
  "key5": "anotherValue51",
  "key6": 999
}, {
  "key4": "anotherValue42",
  "key5": "anotherValue52",
  "key6": 666
}],
    "key10": {
        "key11": "lastvalue"
    }
}
}

我的keyList是

["key1","key2","key4","key5","key6","key9","key11"]

预期的结果是仅保留与密钥列表匹配的键/值,并按键对值进行分组。

{
"key1": ["valueA"],
"key2": [123456],
"key4": ["anotherValue41", "anotherValue42"],
"key5": ["anotherValue51", "anotherValue52"],
"key6": [999, 666],
"key11": "lastvalue"
}

我曾尝试使用键,但无法恢复为值…我发现的所有其他示例都有重复的json结构。

我希望我说得够清楚了。

谢谢西里尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-17 06:11:05

首先,让我们专注于解决这个问题,而不用担心keyList。

这可以通过使用tostream和以下助手函数来方便地完成:

# s should be a stream of [key, value] pairs
def aggregate(s):
 reduce s as $x ({}; .[$x[0]] += [$x[1]] );

然后可以将主筛选器编写为:

aggregate( tostream
  | select(length==2 and (.[0][-1] | type == "string"))
  | [.[0][-1], .[1]] )

碰巧,这会产生原始问题的结果:

{
  "key1": [
    "valueA"
  ],
  "key11": [
    "lastvalue"
  ],
  "key2": [
    123456
  ],
  "key4": [
    "anotherValue41",
    "anotherValue42"
  ],
  "key5": [
    "anotherValue51",
    "anotherValue52"
  ],
  "key6": [
    999,
    666
  ]
}

keyList

为了满足对keyList的要求,让我们假设列表以$keyList的形式提供。

然后,我们可以通过使用index简单地添加一个select条件来达到预期的结果

aggregate( tostream
  | select(length==2 and (.[0][-1] | type == "string"))
  | [.[0][-1], .[1]]
  | select(.[0] as $k | $keyList|index($k) )) 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51370588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档