如何使用jq获取两个字符串数组的交集值?
用JQ找出第二个数组中存在于第一个数组的元素
要实现你需要的效果——筛选出arr2中同时存在于arr1的元素,可以用以下两种JQ方法:
方法一:使用IN操作符
直接遍历arr2,筛选出存在于arr1中的元素:
jq --null-input '["b", "d", "1"] | map(select(IN(["a", "b", "c"][])))'
执行后返回结果:
[ "b" ]
原理:IN(["a", "b", "c"][])检查当前元素是否属于arr1的任意值,select保留符合条件的元素,map将结果整理为数组。
方法二:利用哈希集合提升效率(适合大数组)
如果数组元素数量较多,先把arr1转为哈希集合(以数组元素为键的对象),再筛选arr2的元素会更高效:
jq --null-input ' ($arr1 | {($arr1[]): true}) as $set | $arr2 | map(select($set[.])) ' --argjson arr1 '["a", "b", "c"]' --argjson arr2 '["b", "d", "1"]'
原理:先将arr1转换为{"a":true, "b":true, "c":true}形式的对象,再通过$set[.]判断arr2的元素是否是对象的键,以此确认元素是否存在于arr1中。
你之前使用的-操作符是计算arr1与arr2的差集(即arr1中独有的元素),而上述方法是计算两个数组的交集且仅保留arr2中的对应元素,正好匹配你的需求。
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

