Arrays 使用jq将两个JSON数组合并到一个文件中
我有一个包含两个数组的JSON文件。我想将这些数组组合成一个对象数组,每个对象数组包含来自每个原始数组的一个元素 JSON输入如下所示:Arrays 使用jq将两个JSON数组合并到一个文件中,arrays,json,jq,Arrays,Json,Jq,我有一个包含两个数组的JSON文件。我想将这些数组组合成一个对象数组,每个对象数组包含来自每个原始数组的一个元素 JSON输入如下所示: { "en": [ "E1", "E2", "E3", "E4" ], "fr": [ "F1", "F2", "F3&qu
{
"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"
}
如何让它对每个数组的第一个元素、第二个元素等进行配对。我使用range()对数组的元素进行迭代:
jq '[range(.en|length) as $i | {en: .en[$i], fr: .fr[$i]}]' file.json
您还可以使用
transpose
将数组“压缩”在一起:
[[.en,.fr] | transpose[] | {en:.[0], fr:.[1]} ]
这里有一个解决方案,可以处理任意多个密钥,并且不需要事先知道密钥名称:
def objectify($keys):
[$keys, .] | transpose | map({(.[0]): .[1]}) | add;
keys_unsorted as $keys
| [[.[]] | transpose[] | objectify($keys)]
.en
和.fr
是否总是固定的?或者密钥名称可以是动态的?@Inian密钥会改变,但我不介意使用“硬编码”的jq过滤器。。。谢谢@peak,之前没有遇到过transpose-完成任务吗