差异/2
由于 jq 的“-”运算符在数组上定义的方式,一次调用unique
就足以产生“唯一”的答案:
def difference($a; $b): ($a | unique) - $b;
类似地,对于对称差异,单个排序操作足以产生“唯一”值:
def sdiff($a; $b): (($a-$b) + ($b-$a)) | unique;
相交/2
这是一个更快的版本,intersect/2
它应该适用于所有版本的 jq - 它消除group_by
了有利于sort
:
def intersect(x;y):
( (x|unique) + (y|unique) | sort) as $sorted
| reduce range(1; $sorted|length) as $i
([];
if $sorted[$i] == $sorted[$i-1] then . + [$sorted[$i]] else . end) ;
路口/2
如果你有 jq 1.5,那么这里有一个类似但仍然更快的 set-intersection 函数:它在两个数组的 set-intersection 中生成元素流:
def intersection(x;y):
(x|unique) as $x | (y|unique) as $y
| ($x|length) as $m
| ($y|length) as $n
| if $m == 0 or $n == 0 then empty
else { i:-1, j:-1, ans:false }
| while( .i < $m and .j < $n;
$x[.i+1] as $nextx
| if $nextx == $y[.j+1] then {i:(.i+1), j:(.j+1), ans: true, value: $nextx}
elif $nextx < $y[.j+1] then .i += 1 | .ans = false
else .j += 1 | .ans = false
end )
end
| if .ans then .value else empty end ;