给定数组X和Y(最好都作为输入,否则,一个作为输入,另一个作为硬编码),我如何使用jq输出包含两者共有的所有元素的数组?例如,f的值是多少,使得
echo '[1,2,3,4]' | jq 'f([2,4,6,8,10])'
字符串
将输出
[2,4]
型
?
我尝试了以下方法:
map(select(in([2,4,6,8,10]))) --> outputs [1,2,3,4]
select(map(in([2,4,6,8,10]))) --> outputs [1,2,3,4,5]
型
4条答案
按热度按时间j2datikz1#
注意:此解决方案假定array1没有重复项。
简单说明
所有这些答案的复杂性模糊了对原理的理解。这很不幸,因为原则很简单:
简单Demo
字符串
comm
演示型
有了这样的理解,我就能够模仿the *nix
comm
command的行为在没有选项的情况下,生成三列输出。第一列包含FILE1独有的行,第二列包含FILE2独有的行,第三列包含两个文件共有的行。
型
3df52oht2#
一个简单而快速(但有点幼稚)的过滤器可能基本上做你想要的事情,可以定义如下:
字符串
如果x作为STDIN上的输入提供,并且y以某种其他方式提供(例如,
def y: ...
),那么你可以使用它:intersection(.;y)
个提供两个不同数组作为输入的其他方式包括:
--slurp
选项--arg a v
(或--argjson a v
,如果在您的jq中可用)下面是一个更简单但较慢的def,但实际上速度相当快:
型
下面是一个独立的过滤器,用于查找任意多个数组的交集:
型
示例:
型
当然,如果已知
x
和y
被排序和/或唯一,则更有效的解决方案是可能的。具体参见JSON实体的有限集合rggaifut3#
字符串
eoxn13cs4#
下面是一个通过使用foreach对数组中元素的出现次数进行计数来实现的解决方案
字符串
如果此过滤器位于
filter.jq
中,则型
将产生
型
它假设初始数组中没有重复项。如果不是这样的话,那么很容易用独特的来补偿。例如:
型