jq-过滤JSON数组(如果不包含则不工作)
解析JSON文件时遇到问题,我想从中提取不包含字符串“to Do”作为标签的元素 这是我试图解析的文件jq-过滤JSON数组(如果不包含则不工作),json,parsing,jq,Json,Parsing,Jq,解析JSON文件时遇到问题,我想从中提取不包含字符串“to Do”作为标签的元素 这是我试图解析的文件 [ { "id": 1, "title": "Task A", "labels": [ "Low", "To Do" ] }, { "id": 2, "title": "Task B", "labels": [ "Medium", "Done" ] }, {
[
{
"id": 1,
"title": "Task A",
"labels": [
"Low",
"To Do"
]
},
{
"id": 2,
"title": "Task B",
"labels": [
"Medium",
"Done"
]
},
{
"id": 3,
"title": "Task C",
"labels": [
"High",
"To Do"
]
}
]
我可以使用以下命令成功提取包含“To Do”的元素:
$ cat tmp.json | jq 'keys[] as $k | select(.[$k].labels[] | contains("To Do")) | "\(.[$k].id) -- \(.[$k].title) -- \(.[$k].labels)"'
"1 -- Task A -- [\"Low\",\"To Do\"]"
"3 -- Task C -- [\"High\",\"To Do\"]"
但是,当我否定条件时,jq具有以下行为:
$ cat tmp.json | jq 'keys[] as $k | select(.[$k].labels[] | contains("To Do") | not) | "\(.[$k].id) -- \(.[$k].title) -- \(.[$k].labels)"'
"1 -- Task A -- [\"Low\",\"To Do\"]"
"2 -- Task B -- [\"Medium\",\"Done\"]"
"2 -- Task B -- [\"Medium\",\"Done\"]"
"3 -- Task C -- [\"High\",\"To Do\"]"
这里唯一的区别是条件的否定,但是所有三个元素都被打印,我想过滤的元素被打印两次
谢谢。对于这样一个琐碎的任务,您的查询似乎有点过于复杂(我没有调试,但您可能在那里误用了
contains
;我怀疑它针对每个数组元素运行,而不是针对数组本身运行一次)
无论如何,这里有一个简洁明了的方法:
.[] | select(.labels | index("To Do") | not) | "\(.id) -- \(.title) -- \(.labels)"
顺便说一句,我会选择
all(;!=“To Do”)
:
.[]
| select( all(.labels[]; . != "To Do"))
| "\(.id) -- \(.title) -- \(.labels)"