Syntax 使用多个条件过滤对象,包括比较两个对象字段

Syntax 使用多个条件过滤对象,包括比较两个对象字段,syntax,jq,Syntax,Jq,有一个JSON对象的列表,我试图根据最小值检查和它的两个字段之间的比较来过滤它们 { "preview": false, "init_offset": 0, "messages": [], "fields": [ { "name": "A" }, { "name": "B" }, { "name": "Diff" }, { "name": "Threshold" }

有一个JSON对象的列表,我试图根据最小值检查和它的两个字段之间的比较来过滤它们

{
  "preview": false,
  "init_offset": 0,
  "messages": [],
  "fields": [
    {
      "name": "A"
    },
    {
      "name": "B"
    },
    {
      "name": "Diff"
    },
    {
      "name": "Threshold"
    }
  ],
  "results": [
    {
      "A": "foo",
      "B": "bar",
      "Diff": "1095",
      "Threshold": "1200"
    },
    {
      "A": "baz",
      "B": "bux",
      "Diff": "81793",
      "Threshold": "0"
    },
    {
      "A": "quux",
      "B": "quuz",
      "Diff": "194"
    },
    {
      "A": "moo",
      "B": "goo",
      "Diff": "5000",
      "Threshold": "2000"
    }
 ]
}
我最接近的是

.results
| map(.Threshold //= "0")
| .[]
| select((.Threshold|tonumber > 0) and 
         (.Diff|tonumber > .Threshold|tonumber))
但这给了我们一个机会

Cannot index string with string "Threshold"
错误

基本上,我想返回Diff大于非零阈值的所有结果。因此,在这种情况下:

{
  "A": "moo",
  "B": "goo",
  "Diff": "5000",
  "Threshold": "2000"
}

使用jq1.5fwiw.

您只是缺少一些括号。比较:

select((.Threshold|tonumber) > 0 and
       (.Diff|tonumber) > (.Threshold|tonumber))
或者避免双重转换:

select( (.Threshold|tonumber) as $t
        | $t > 0 and (.Diff|tonumber) > $t )
您还可以稍微简化整个程序:

.results[]
| select( ((.Threshold // 0) | tonumber) as $t 
          | $t > 0 and (.Diff|tonumber) > $t )

给出
jq:error(在jq1:44):null(null)不能被解析为数字。需要
jq.results[]|为没有
Threshold的对象选择(.Threshold和(.Threshold|tonumber)作为$t |$t>0和((.Diff|tonumber)>$t))
key@RomanPerekrest-我只是显示“选择”行,而不是完整的程序。另外,您的备选方案也会更改语义。