Этот код работает так, как ожидалось:
jq --argjson BL ${BL} '.rows[] | select(.cells[] | .value | IN($BL[]))
Возвращает список элементов, содержащих значение в $BL.
Я хочу вернуть все те, которых нет в $BL, поэтому я использую | нет
Он возвращает тот же результат, что и без | нет, вроде без разницы.
jq --argjson BL ${BL} '.rows[] | select(.cells[] | .value | IN($BL[]) | not)
используя следующее, вообще ничего не перенастраивал
jq --argjson BL ${BL} '.rows[] | select(.cells[] | .value | IN($BL[]|not))
есть ли простая вещь, которую мне не хватает при использовании IN с NOT?
для справки $BL - это и массив адресов электронной почты, пытающихся сделать вызов API и вернуть все элементы, у которых нет адреса электронной почты, указанного в $BL
... и кстати, я думаю, вы хотите --argjson BL "$BL"
, если только этот код не предназначен только для людей, использующих zsh; без кавычек он будет работать неправильно в других оболочках POSIX-y, когда ваши данные содержат пробелы (или символы глобуса в оболочке с включенными nullglob
или failglob
).
Ваш select
получает ряд логических значений, по одному для каждого элемента в массиве .cells
. Использование not
инвертирует их все, что означает, что если бы у вас был смешанный набор логических значений, он все равно был бы смешанным, и в любом случае select
перенесет те, которые оцениваются, в true
.
Решение состоит в том, чтобы использовать any
или all
для агрегат этих логических значений. Без каких-либо образцов данных, я предполагаю, что вы ищете
.rows[] | select(any(.cells[]; .value | IN($BL[])) | not)
Убедитесь, что вы предоставляете минимальный воспроизводимый пример. Если нам нужно создать собственные данные для проверки вашего выражения, меньшее количество людей будет работать над вашей проблемой или, по крайней мере, предоставит решения проверено. (В той степени, в которой вы можете сделать выражение максимально простым, что позволит вам продемонстрировать проблему, это также может сделать данные, необходимые для ее тестирования, короче / проще / проще).