2

使用 jq,我正在搜索一个大型 json 文件,该文件具有在属性中包含多个年份值的对象。我希望能够缩小搜索范围,只检索大于或小于(更早或更年轻)的对象(例如 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"
  ]
}
4

1 回答 1

2

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

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

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

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

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

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

于 2019-07-10T21:10:43.607 回答