使用 jq,如何从两个 JSON 文件中减去具有不同键和值的 2 个数组?
Using jq, how to subtract 2 arrays with different keys and values from two JSON files?
这听起来像是一个基本问题,但我已经寻找更好的解决方案一段时间了...
我有以下文件:
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...只是找不到如何...
Select 只有 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}'
这是一个使用 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
}
这听起来像是一个基本问题,但我已经寻找更好的解决方案一段时间了...
我有以下文件:
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...只是找不到如何...
Select 只有 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}'
这是一个使用 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
}