如何在 jq 中制作笛卡尔积?
How to make a cartesian product in jq?
假设我有输入
[
{
"a":1,
"b":2
},
{
"a":3,
"b":4
}
]
我试过了,
echo '[{"a": 1, "b": 2}, {"a": 3, "b": 4}]' | jq '[{x: .[].a, y: .[].b}]'
我想得到
[
{
"x":1,
"b":2,
"language":"en"
},
{
"x":1,
"b":2,
"language":"fr"
}...
]
意味着我需要为数组中的所有项目输出两项,一项添加了 "lanuage": "en"
键值对,另一项添加了 "lanuage": "ru"
编辑。以防万一还不清楚。我需要一个对象输入数组 is
与另一个数组 xs
的数学乘积,这将给我成对 (i, x)
。对于每一对,我想输出具有 i
的所有(键,值)对的对象加上一些键(在我的例子中是 language
),值为 x
.
一般来说,任何生成多个值的表达式与另一个生成多个值的表达式相结合将创建一个笛卡尔积。
即
"\(1,2) \(3,4)"
生成字符串 "1 3"
、"2 3"
、"1 4"
和 "2 4"
.
您可以在给定一组值的情况下执行相同的操作。 []
将获取数组并为每个项目生成一个结果。所以结合这些概念,你可以做这样的事情:
$ jq --argjson langs '["en","fr"]' '[(.[]|{x:.a,b}) + {language:$langs[]}]' input.json
但这可以进一步简化为:
$ jq --argjson langs '["en","fr"]' '[.[]|{x:.a,b,language:$langs[]}]' input.json
或
$ jq --argjson langs '["en","fr"]' 'map({x:.a,b,language:$langs[]})' input.json
假设我有输入
[
{
"a":1,
"b":2
},
{
"a":3,
"b":4
}
]
我试过了,
echo '[{"a": 1, "b": 2}, {"a": 3, "b": 4}]' | jq '[{x: .[].a, y: .[].b}]'
我想得到
[
{
"x":1,
"b":2,
"language":"en"
},
{
"x":1,
"b":2,
"language":"fr"
}...
]
意味着我需要为数组中的所有项目输出两项,一项添加了 "lanuage": "en"
键值对,另一项添加了 "lanuage": "ru"
编辑。以防万一还不清楚。我需要一个对象输入数组 is
与另一个数组 xs
的数学乘积,这将给我成对 (i, x)
。对于每一对,我想输出具有 i
的所有(键,值)对的对象加上一些键(在我的例子中是 language
),值为 x
.
一般来说,任何生成多个值的表达式与另一个生成多个值的表达式相结合将创建一个笛卡尔积。
即
"\(1,2) \(3,4)"
生成字符串 "1 3"
、"2 3"
、"1 4"
和 "2 4"
.
您可以在给定一组值的情况下执行相同的操作。 []
将获取数组并为每个项目生成一个结果。所以结合这些概念,你可以做这样的事情:
$ jq --argjson langs '["en","fr"]' '[(.[]|{x:.a,b}) + {language:$langs[]}]' input.json
但这可以进一步简化为:
$ jq --argjson langs '["en","fr"]' '[.[]|{x:.a,b,language:$langs[]}]' input.json
或
$ jq --argjson langs '["en","fr"]' 'map({x:.a,b,language:$langs[]})' input.json