Как выбрать объект в JQ, который соответствует больше или меньше, чем для нескольких значений в атрибуте - PullRequest
0 голосов
/ 10 июля 2019

Используя jq, я ищу в большом файле json, в котором есть объекты, которые содержат несколько значений года в атрибуте.Я хочу иметь возможность сузить свой поиск и получать только те объекты, которые больше или меньше (старше или моложе), чем ГОД (пример 2015 г.).Это сложно, потому что атрибуты могут иметь несколько значений года, некоторые больше и меньше года, который я ищу.

Вот пример кода, который я ищу.Это все в основном это.

cat stackover.json

{
    "tokens": [
{
 "Name": "stack overflow",
  "year": [
    "1997",
    "1998",
    "1997"
  ]
},
{
  "Name": "Return pizza",
  "year": [
    "1998",
    "2015",
    "2014",
    "1998"
  ]
}
]
}

Я знаю, как искать a, содержит одно из значений ... но могу понять, как искать все значения и определять, все ли они меньше 2000.

Если я ищу меньше «<», я не получаю обратно обратно.Если я ищу больше «>», то я получаю оба объекта несколько раз

cat stackover.json | jq '.tokens[] | select(.year[] > 2000)'
{
  "Name": "stack overflow",
  "year": [
    "1997",
    "1998",
    "1997"
  ]
}
{
  "Name": "stack overflow",
  "year": [
    "1997",
    "1998",
    "1997"
  ]
}
{
  "Name": "stack overflow",
  "year": [
    "1997",
    "1998",
    "1997"
  ]
}
{
  "Name": "Return pizza",
  "year": [
    "1998",
    "2015",
    "2014",
    "1998"
  ]
}
{
  "Name": "Return pizza",
  "year": [
    "1998",
    "2015",
    "2014",
    "1998"
  ]
}
{
  "Name": "Return pizza",
  "year": [
    "1998",
    "2015",
    "2014",
    "1998"
  ]
}
{
  "Name": "Return pizza",
  "year": [
    "1998",
    "2015",
    "2014",
    "1998"
  ]
}

То, что я пытаюсь выполнить.

Если я ищу что-то меньшее, чем 2000, я хочу запрос, который будет возвращать только «переполнение стека», так как он не имеет значения 20XX в доступных значениях.

cat stackover.json | code searching for only objects(stack overflow) where all values are less than 2000. 

{
  "Name": "stack overflow",
  "year": [
    "1997",
    "1998",
    "1997"
  ]
}

1 Ответ

0 голосов
/ 11 июля 2019

Короче говоря, all/2 ваш друг.

Предполагая, что мы определили $ mx (строку) как год окончания, подходящим фильтром будет:

.tokens[] | select( all(.year[]; . < $mx) )

Параметр командной строки '--arg mx N' интерпретирует Nкак строка, поэтому подходящий вызов будет выглядеть так:

jq --arg mx 2000 -f filter.jq stackover.json

(Обратите внимание, что мы можем избежать преобразования дат в числа, если $ mx будет строкой.)

...