В jq я могу довольно легко выбрать элемент в списке:
$ echo '["a","b","c","d","e"]' | jq '.[] | select(. == ("a","c"))'
Или, если вы предпочитаете получить его как массив:
$ echo '["a","b","c","d","e"]' | jq 'map(select(. == ("a","c")))'
Но как мне выбрать все элементы, которых нет в списке? Конечно . != ("a","c")
не работает:
$ echo '["a","b","c","d","e"]' | jq 'map(select(. != ("a","c")))'
[
"a",
"b",
"b",
"c",
"d",
"d",
"e",
"e"
]
Вышеупомянутый каждый элемент дает дважды, за исключением "a"
и "c
"
То же самое для:
$ echo '["a","b","c","d","e"]' | jq '.[] | select(. != ("a","c"))'
"a"
"b"
"b"
"c"
"d"
"d"
"e"
"e"
Как отфильтровать исключить совпадающие элементы?
. != "a" or . != "c"
. Это, конечно, всегда будет правдой, поэтому вы не видите ничего отфильтрованного. Однако теперь вы получаете дубликаты, поскольку используете оператор запятой. Помните, что для каждого значения, полученного из запятых, выражение повторно вычисляется с новыми значениями. Итак,select(. != ("a","c"))
становитсяselect(. != "a"), select(. != "c")
. Тогда должно быть очень ясно, что происходит. - person Jeff Mercado   schedule 16.06.2017. != ("a","c")
- это логическое ИЛИ, где я ожидал логического И (хотя. == ("a","c")
является логическим ИЛИ). - person deitch   schedule 16.06.2017("a","c")
- это два значения"a"
и"c"
. Для любого выражения, которое его использует, скопируйте выражение, подставив значения"a"
и"c"
для копий. - person Jeff Mercado   schedule 16.06.2017