使用jq,我正在搜索一个大型json文件,该文件的对象的属性中包含多个年份值。我希望能够缩小搜索范围,仅检索大于或小于(年纪或年数)YEAR(例如2015年)的对象。这很棘手,因为这些属性可以具有多个年份值,有些大于或小于我要搜索的年份。
这是我正在搜索的代码的示例。基本上就是这些。
cat stackover.json
{
"tokens": [
{
"Name": "stack overflow",
"year": [
"1997",
"1998",
"1997"
]
},
{
"Name": "Return pizza",
"year": [
"1998",
"2015",
"2014",
"1998"
]
}
]
}
我知道如何搜索包含一个值的......但是可以弄清楚如何搜索所有值并确定所有值是否都小于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"
]
}
答案 0 :(得分:0)
简而言之,all/2
是您的朋友。
假设我们将$ mx(一个字符串)定义为截止年份,则合适的过滤器为:
.tokens[] | select( all(.year[]; . < $mx) )
命令行选项'--arg mx N'将N解释为字符串,因此合适的调用如下:
jq --arg mx 2000 -f filter.jq stackover.json
(请注意,我们可以通过使$ mx为字符串来避免将日期转换为数字。)