如何在jq中选择匹配大于或小于属性中多个值的对象

时间:2019-07-10 19:54:28

标签: json jq

使用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"
  ]
}

1 个答案:

答案 0 :(得分:0)

简而言之,all/2是您的朋友。

假设我们将$ mx(一个字符串)定义为截止年份,则合适的过滤器为:

.tokens[] | select( all(.year[]; . < $mx) )

命令行选项'--arg mx N'将N解释为字符串,因此合适的调用如下:

jq --arg mx 2000 -f filter.jq stackover.json

(请注意,我们可以通过使$ mx为字符串来避免将日期转换为数字。)