【发布时间】:2019-11-15 11:26:21
【问题描述】:
(这里是jq新手,对不起,如果这个问题有一个明显的答案:))
我想根据一个值是否在列表中不是来过滤json。
这是一个具体的例子:
输入
[
{
"n": "A",
"a": 659533330984,
"vals": {
"n2": "B",
"b": 5193941030
}
},
{
"n": "A",
"a": 659533330984,
"vals": {
"n2": "C",
"b": 4872891707
}
},
{
"n": "B",
"a": 659533330984,
"vals": {
"n2": "C",
"b": 4872891707
}
}
]
过滤器
[.n, .vals.n2]不在(["A", "B"], ["B", "C"])中
因此,在 jq 中,我尝试了以下命令(同样基于 this related question)
jq '[ .[] | select([.n, .vals.n2] as $i | (["A", "B"], ["B", "C"]) | index($i) | not )]'
和
jq '[ .[] | select([.n, .vals.n2] != (["A", "B"], ["B", "C"]))]'
但是,这两个命令都给出了输出
[
{
"n": "A",
"a": 659533330984,
"vals": {
"n2": "B",
"b": 5193941030
}
},
{
"n": "A",
"a": 659533330984,
"vals": {
"n2": "C",
"b": 4872891707
}
},
{
"n": "A",
"a": 659533330984,
"vals": {
"n2": "C",
"b": 4872891707
}
},
{
"n": "B",
"a": 659533330984,
"vals": {
"n2": "C",
"b": 4872891707
}
}
]
而这将是所需的输出——没有重复并且所有“黑名单”值的逻辑与:
[
{
"n": "A",
"a": 659533330984,
"vals": {
"n2": "C",
"b": 4872891707
}
}
]
第二个命令不起作用是有道理的,因为如果我理解正确,逗号运算符基本上意味着 jq 为每个列出的元素计算一次表达式 - 因此重复。然而,简单地通过unique 管道并没有帮助,因为输出不应包含 任何 过滤器对。
我目前唯一的另一个想法是通过选择通过选择管道选择...对于“黑名单”中的每个项目。但是,我想将黑名单作为输入读取——我可以动态创建命令,但我想知道是否有更漂亮的解决方案?感觉好像一定有……
我很高兴听到您对如何以最佳方式处理此问题的意见。
我使用的是 jq 版本 jq-1.5-1-a5b5cbe。
【问题讨论】: