使用 jq 从其他数组派生数组(参见 Python 列表推导)

Deriving an array from other arrays with jq (cf. Python list comprehensions)

假设以下 json 包含两个数组:

{"zones":["dev01","dev02","dev03","dev04","dev05","dev06","dev07","dev08","dev09","dev10","dev11","dev12","dev13","dev14","dev15","dev16","dev17","dev18","dev19","dev20"],"disabled_zones":["dev01","dev05","dev06","dev08","dev10","dev11","dev12","dev13","dev14","dev15","dev16","dev17","dev18","dev19","dev20"]}

我希望导出第三个数组,其中包含出现在第一个数组中但不在第二个数组中的项目:

{"enabled_zones":["dev02","dev03","dev04","dev07","dev09"]}

我想用 jq 来完成这个任务

在 python 中,我将使用列表理解来实现此目的:

>>> zones = ["dev01","dev02","dev03","dev04","dev05","dev06","dev07","dev08","dev09","dev10","dev11","dev12","dev13","dev14","dev15","dev16","dev17","dev18","dev19","dev20"]
>>> disabled_zones = ["dev01","dev05","dev06","dev08","dev10","dev11","dev12","dev13","dev14","dev15","dev16","dev17","dev18","dev19","dev20"]
>>> enabled_zones = [x for x in zones if x not in disabled_zones]
>>> print(enabled_zones)
['dev02', 'dev03', 'dev04', 'dev07', 'dev09']

我目前正在尝试使用 foreach 遍历 array1 中的项目,并使用 in 检查它们是否存在于 array2 中,但我在语法上遇到困难。

如何使用 jq 实现此目的?

来自 jq manual :

As well as normal arithmetic subtraction on numbers, the - operator can be used on arrays to remove all occurrences of the second array’s elements from the first array.

这样就可以了:

jq '{ "enabled_zones": (.zones - .disabled_zones) }' data.json