如何在jq制作笛卡尔积?

时间:2017-02-02 10:27:19

标签: json shell 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"

EDIT。如果不清楚enoug。我需要一个对象输入数组is的catesian产品和另一个数组xs,它会给我(i, x)对。对于每一对,我想输出具有i的所有(键,值)对以及一些键(在我的情况下为language)的对象,其值为x

1 个答案:

答案 0 :(得分:1)

通常,任何生成多个值的表达式与另一个生成多个值的表达式相结合都会创建一个笛卡尔积。

即,

"\(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