jq使用相同对象的值进行比较

时间:2018-10-04 09:20:51

标签: json jq

我有一个json文件

a.json:

{
  "t": 3
}
{
  "t": 6
}
{
  "t": 13
}

和另一个文件

b.json:

{
  "t1": 1,
  "t2": 4
}
{
  "t1": 7,
  "t2": 8
}
{
  "t1": 11,
  "t2": 13
}

我想从a.json中找到t值,它们位于b.json对象的任何单个范围t1,t2之间。

所以预期的输出是

{
  "t": 3
}
{
  "t": 13
}

我尝试过 jq --slurpfile a a.json --slurpfile b b.json -n '$a[] | select(.t >= $b[].t1 and .t <= $b[].t2)'jq --slurpfile a a.json --slurpfile b b.json -n '$a[] | select(.t == range($b[].t1, $b[].t2))',但是对$b的同一对象不会进行比较,并且我没有得到预期的输出。

请帮助。

2 个答案:

答案 0 :(得分:2)

以下解决方案着眼于效率,还处理b.json定义的间隔重叠的情况:

< a.json jq --slurpfile b b.json '
  def check($value):
    if any(.[]; .t1 <= $value and $value <= .t2) 
    then {t:$value} 
    else empty
    end ;
  . as $a | $b | check($a.t)
' 

特别是:

  • 我们使用any,以便尽快停止搜索适用范围;
  • 我们避免“抓取” a.json以节省RAM;
  • 在任何范围都很大的情况下,我们避免使用range

答案 1 :(得分:0)

您可以使用以下jq过滤器:

jq --slurpfile a a.json --slurpfile b b.json -n \
  '$a[] | [.t] | if inside($b[] | [ range(.t1; .t2+1) ]) then {t:.[]} else empty end'

对于a.json中的所有值,请查看该值是否属于文件b.json的数组组成的范围的一部分。