【问题标题】:Multiply arrays in JQJQ中的数组相乘
【发布时间】:2021-09-06 21:53:22
【问题描述】:

我在 2 个文件中有 2 个数组,我正在尝试使用 JQ 将它们相乘。

file1.json

[
 {"a": "1", "b": "2"},
 {"a": "3", "b": "4"}
]

file2.json

[
 {"x": "10", "y": "12", "z": "15"},
 {"x": "20", "y": "22", "z": "25"}
]

和预期的输出:

[
 {"a": "1", "b": "2", "x": "10", "y": "12", "z": "15"},
 {"a": "1", "b": "2", "x": "20", "y": "22", "z": "25"},
 {"a": "3", "b": "4", "x": "10", "y": "12", "z": "15"},
 {"a": "3", "b": "4", "x": "20", "y": "22", "z": "25"}
]

当我执行jq .[0] * .[1] file1.json file2.json 时,它会说

数组...和数组...不能相乘

【问题讨论】:

    标签: json jq


    【解决方案1】:
    jq -c ".[]" file1.json  > f1.jl
    jq -c ".[]" file2.json  > f2.jl
    while read a; do while read b; do echo $a $b | jq -s 'add' -c ; done < f2.jl  ; done < f1.jl | jq -s 
    

    【讨论】:

      【解决方案2】:

      你还没有很清楚你的意图。我推断您正在寻找输入数组的笛卡尔积,这样您的输出数组对于 file1 数组中的一个对象和 file2 数组中的一个对象的每个可能配对都有一个对象,并且输出对象是两个成对的输入对象。

      任何时候你在对象构造函数或二元运算中组合输出多个项目的两个表达式,你都会得到一个笛卡尔积。由于+ 运算符将对象合并在一起,因此它是一个很好的候选对象。

      这应该做你想做的:

      jq -n --slurpfile file1 file1.json --slurpfile file2 file2.json '[$file2[0][] + $file1[0][]|{a,b,x,y,z}]'
      

      我们需要第一个 [0] 来“解包”--slurpfile 引入的额外数组。以下[] 遍历输入数组中的所有对象。由于+ 运算符的两个子表达式都产生多个项目,因此我们得到了所需的笛卡尔积。最后,{a,b,x,y,z} 用于按您想要的顺序放置输出字段 - 它主要是装饰性的,如果您不关心,可以省略它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        • 2020-04-08
        • 2018-04-11
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多