使用jq在单个文件中合并两个JSON数组

时间:2020-10-05 14:11:07

标签: arrays json jq

我有一个带有两个数组的JSON文件。我想将这些数组组合成单个对象数组,每个对象都包含每个原始数组中的一个元素。

JSON输入如下所示:

{
  "en": [
    "E1",
    "E2",
    "E3",
    "E4"
  ],
  "fr": [
    "F1",
    "F2",
    "F3",
    "F4"
  ]
}

所需的输出:

[
  { "en":"E1", "fr":"F1"},
  { "en":"E2", "fr":"F2"},
  { "en":"E3", "fr":"F3"},
  { "en":"E4", "fr":"F4"}
]

无论我如何尝试,我都无法驯服jq来实现这一目标。我最近来的是使用过滤器. | {en:.en[],fr:.fr[]},它为我提供了数组的所有可能配对,如下所示:

{
  "en": "E1",
  "fr": "F1"
}
{
  "en": "E1",
  "fr": "F2"
}
{
  "en": "E1",
  "fr": "F3"
}
{
  "en": "E1",
  "fr": "F4"
}
{
  "en": "E2",
  "fr": "F1"
}
{
  "en": "E2",
  "fr": "F2"
}
{
  "en": "E2",
  "fr": "F3"
}
{
  "en": "E2",
  "fr": "F4"
}
{
  "en": "E3",
  "fr": "F1"
}
{
  "en": "E3",
  "fr": "F2"
}
{
  "en": "E3",
  "fr": "F3"
}
{
  "en": "E3",
  "fr": "F4"
}
{
  "en": "E4",
  "fr": "F1"
}
{
  "en": "E4",
  "fr": "F2"
}
{
  "en": "E4",
  "fr": "F3"
}
{
  "en": "E4",
  "fr": "F4"
}

如何获取每个数组的第一个元素,第二个元素等的配对

3 个答案:

答案 0 :(得分:3)

您还可以使用transpose将数组“压缩”在一起:

[[.en,.fr] | transpose[] | {en:.[0], fr:.[1]} ]

答案 1 :(得分:1)

我使用range()遍历数组的元素:

jq '[range(.en|length) as $i | {en: .en[$i], fr: .fr[$i]}]' file.json

答案 2 :(得分:0)

这里的解决方案可以使用任意多个密钥,并且不需要事先知道密钥名称:

def objectify($keys):
  [$keys, .] | transpose | map({(.[0]): .[1]}) | add;

keys_unsorted as $keys
| [[.[]] | transpose[] | objectify($keys)]