JQ сравнить, используя значения одного и того же объекта - PullRequest
0 голосов
/ 04 октября 2018

У меня есть один файл json

a.json:

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

И еще один файл

b.json:

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

IЯ хочу найти значения t из a.json, которые находятся между любыми отдельными диапазонами t1, t2 объектов b.json.

Таким образом, ожидаемый результат равен

{
  "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 голосов
/ 04 октября 2018

Следующее решение ориентировано на эффективность, а также обрабатывает случай, когда интервалы, определенные 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 для экономии оперативной памяти;
  • мы избегаем range в случае, если любой из диапазоновбольшой.
0 голосов
/ 04 октября 2018

Вы можете использовать этот фильтр 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.

...