【问题标题】:How do I use jq to map {a:b,c:[0,1]} to [{c:c[0],a:b},{c:c[1],a:b}]?如何使用 jq 将 {a:b,c:[0,1]} 映射到 [{c:c[0],a:b},{c:c[1],a:b}]?
【发布时间】:2018-09-25 18:06:56
【问题描述】:

我正在尝试改变

{
  "login": "username",
  "emails": [
    "email_1@example.com",
    "email_2@example.com"
  ]
}

进入

[
  {
    "email": "email_1@example.com",
    "login": "username"
  },
  {
    "email": "email_2@example.com",
    "login": "username"
  }
]

但是,对于我的一生,我无法弄清楚如何。我查看了 jq 的 map 和 reduce 功能,但我的语法一定是不正确的。

如果你们能提供任何帮助,我将不胜感激。谢谢!

编辑

感谢所有回复的人。正如您可能已经猜到的那样,这是更大转型的核心问题。我实际上在一个目录中处理大约 752 个单独的 JSON 文件,每个文件都有一个相似的对象。我想将它们全部转换为一组登录名和电子邮件。感谢@peak的回答,我设法创建了以下内容:

jq -s '.[] | {login, email: .emails[]?}' *.json | jq -s 'map(select(true))'

请注意,我将.emails[] 更改为.emails[]? 是为了说明.emails 的某些值可能是null

【问题讨论】:

  • 您的解决方案(在编辑中)似乎不必要地复杂且效率低下。 jq FILTER *.json | jq -s . 之类的东西应该是可能的,其中 FILTER 产生一个对象流。
  • 嗨@peak,谢谢!我对jq 还很陌生,还在学习。

标签: json jq


【解决方案1】:

一个 jq-esque(看,没有变量!)解决方案:

[{login} + {email: .emails[]}]

或者更简洁:

[{login, email: .emails[]}]

(也许你可以不用外方括号?)

【讨论】:

  • 哇,这真是该死的光滑峰。不错的工作!我想为您和@RomanPerekhrest 提供答案,但它只允许我选择一个。除非有人能告诉我为什么 Roman 的“更”正确,否则我会选择你的。
  • 嗨@peak,您可以删除外部方括号,但这样做需要将新对象放入 map 调用中,以便将其放入新数组中。你的括号更简洁,效果很好。
【解决方案2】:

基本上,在电子邮件列表上使用地图功能。

data = {
  "login": "username",
  "emails": [
    "email_1@example.com",
    "email_2@example.com"
  ]
}

result = data.emails.map((x)=> ({"login": data.login, "email": x}));
console.log(result);

我的误解,对于jq的版本看@RomanPerekhrest的回答

【讨论】:

  • 首先,非常感谢您的快速回复!其次,我真的很抱歉我是个白痴,但是您在回答中使用了什么语言/框架(这有效,谢谢!)?我正在尝试使用 jq 来完成此操作,并且您提供了一个看起来像 lambda 的东西,其中 x 绑定到 emails 数组的元素。我不确定如何用 jq 实现这一目标?
  • @akutz 我没有在第一个解决方案中使用任何框架。 map 函数是内置的 javascript,比 jq 更简单。但我也添加了jq 版本。它几乎几乎相同,语法略有不同。
【解决方案3】:

jq 方法:

jq '.login as $uname | .emails | map({email: ., login: $uname})' input.json

输出:

[
  {
    "email": "email_1@example.com",
    "login": "username"
  },
  {
    "email": "email_2@example.com",
    "login": "username"
  }
]

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2017-10-24
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多