首页 > 解决方案 > 对 json 数组使用 jq 选择操作

问题描述

我有 2 个 json 数组:data1 和 data2。我正在尝试使用 jq 将 2 个 json 数组合并为一个 json。为此:我正在从 data1 中获取共享属性“region”,并尝试在 data2 中找到匹配的属性。然而,jq 的选择无法使用我传递的参数,但它确实适用于任何特定值。

data1='[ 
 {"domain": "domain1", "region": "region1"}, {"domain": "domain2","region": "region2"}, { "domain": "domain3", "region": "region3"} ]'

data2='[ 
 {"region": "eustaging1", "secret": "s1"}, {"region": "eustaging2", "secret": "s2"}, { "region": "eustaging2", "secret": "s3"}]'

for k in $(jq -c '.[]' <<< "$data1"); do
    crgn=$(jq '.region' <<< $k)
    # select with parameter not working :(
    matching_obj=$(jq -c  '.[] | select(.region=="$crgn") ' <<< "$data2")
    echo "current region is $crgn" 
    echo "matching object is $matching_obj"
done

输出:

 current region is "region1"
 matching object is
 current region is "region2"
 matching object is
 current region is "region3"
 matching object is

标签: jsonbashshellparsingjq

解决方案


我不得不使用单引号。不是双引号。并且不需要命名参数。

for k in $(jq -c '.[]' <<< "$data1"); do
    current_region=$(jq '.region' <<< $k)
    matching_obj=$(jq -c '.[] | select(.region=='$current_region')' <<< "$data2")
    echo "matching_obj is $matching_obj"
    echo "current region is $current_region" 
done

推荐阅读