jq - 将对象列表转换为摘要对象

9

我有一个类似这样的JSON数据:

[
  {
    "tone_id": "anger",
    "score": 0.012,
    "tone_name": "Anger"
  },
  {
    "tone_id": "disgust",
    "score": 0.002,
    "tone_name": "Disgust"
  },
  {
    "tone_id": "fear",
    "score": 0.14,
    "tone_name": "Fear"
  },
  {
    "tone_id": "joy",
    "score": 0.42,
    "tone_name": "Joy"
  }
]

我希望使用 jq 将其转换成以下样式:
{
  "anger": 0.012,
  "disgust": 0.002,
  "fear": 0.14,
  "joy": 0.42
}

我能做的最好就是:


cat result.json | jq '.[] | { (.tone_id): .score }'

这给出了以下结果:

{
  "anger": 0.012
}
{
  "disgust": 0.002
}
{
  "fear": 0.14
}
{
  "joy": 0.42
}

我知道可以使用其他方法轻松地完成这个任务。只是想知道是否可以使用 jq 一行代码来实现?


展示一下如何处理潜在的第三个和第四个对象?扩展您的输入数组。 - RomanPerekhrest
这只是一个 tone_id 列表和它们各自的 score 的列表... 我希望在我的最终对象中有与原始列表中元素数量相同的键。 - munikarmanish
@RomanPerekhrest 确切地说,第一个和第二个对象是如何处理的。提取 tone_idscore 并将它们分别作为键和值放入最终输出中。我已经在上面添加了更具体的示例。 - munikarmanish
3个回答

10

一个单调的一行命令:

 jq 'map( {(.tone_id): .score} ) | add'

(在传递给add之前,您还可以在.[] | {(.tone_id):.score}周围包装方括号-这两种方法是等效的。)

1
您可以使用from_entries
jq '[.[] | {key: .tone_id, value: .score}] | from_entries' tmp.json
# or jq 'map({key: .tone_id, value: .score}) | from_entries' tmp.json

尽管在这种情况下,我没有看到任何推荐它优于@peak的add解决方案的东西。

0

使用 reduce 函数:

jq 'reduce .[] as $o ({}; .[$o["tone_id"]] = $o["score"])' result.json

输出结果:

{
  "anger": 0.012,
  "disgust": 0.002,
  "fear": 0.14,
  "joy": 0.42
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接