使用jq,如何从两个JSON文件中减去具有不同键和值的2个数组?

时间:2016-06-18 14:55:56

标签: arrays json bash jq

这听起来像是一个基本问题,但我已经在一段时间内一直在寻找更好的解决方案......

我有以下文件:

file0.json:

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

file1.json:

[ 
    {"b":1},
    {"b":2},
    {"b":7}
]

我希望在那之间减去预期的结果:

{
  "key": 3
}
{
  "key": 4
}

我想到了以下命令可以完成这项工作:

bash$ jq -s '[.d.aaData[].a] - [.[].b] | { key: .}' file0.json file1.json

但是它给了我以下错误:

Cannot index array with string "b"

有道理,因为[.[1].b]不会创建数组,但[1][2][7]

我设法获得预期结果的唯一方法是在我的bash脚本中编写脏解决方案:

bash$ a=$(jq '[.d.aaData[].a] | {key1: .}' file0.json)
bash$ b=$(jq '[.[].b] | {key2: . }' file1.json)
bash$ c=$(echo -n $a,$b)
bash$ echo $c
{ "key1": [ 1, 2, 3, 4 ] },{ "key2": [ 1, 2, 7 ] }
bash$ d=${c//"},{"/","}
bash$ echo $d
{ "key1": [ 1, 2, 3, 4 ] , "key2": [ 1, 2, 7 ] }
bash$ echo -n $d | jq '.key1 - .key2 | { key: .[] }'
{
  "key": 3
}
{
  "key": 4
}

我非常确定有更好的方法来使用jq ....只是无法找到...

2 个答案:

答案 0 :(得分:0)

仅选择a中与b中的所有值不同的值。

jq -n --argfile a file0.json --argfile b file1.json '
  $a.d.aaData[].a as $a 
  | select([$b[].b]
  | all(. != $a))
  | {key: $a}'

答案 1 :(得分:0)

这是一个使用jq -数组差异运算符的解决方案:

    [ $file0.d.aaData[] | {key:.a} ]
  - [ $file1[]          | {key:.b} ]
| .[]    

假设filter.json包含此过滤器,则

jq -M -n --argfile file0 file0.json --argfile file1 file1.json -f filter.json

产生

{
  "key": 3
}
{
  "key": 4
}