【问题标题】:JQ select filter with multiple arguments [duplicate]JQ选择具有多个参数的过滤器[重复]
【发布时间】:2018-03-13 19:11:00
【问题描述】:

鉴于然后遵循 JSON

[
  {
    "id": "1",
    "name": "sausage",
    "value": 100
  },
  {
    "id": "2",
    "name": "spam",
    "value": 200
  },
  {
    "id": "3",
    "name": "eggs",
    "value": 300
  }
]

我可以使用id=3 选择一条记录:

jq '.[] | select(.id=="3") | .name,.value' data.json
### > "sausage"
### > "100"

但是如何选择多个id,即带有id in (1,2)的项目?

## this is something I wish I could do
jq '.[] | select(.id in ("1", "2") | .name,.value' data.json 

我试过了:

jq '.[] | select(.id=="1") or select(.id=="2") | .name,.value' data.json

但这会导致错误。

【问题讨论】:

  • @JeffMercado,我徘徊为什么jq 'map(select(.id | in(["1","3"])))' data.json 不起作用?你觉得怎么样?
  • in 令人困惑。文档说key | in(object) is the inverse of object | has(key) 所以在这里使用in 你会想要map( select( .id | in({"1":true, "3":true}))) 这样的东西。如果您想在数组["1","3"] 中搜索,那么inside 可能就是您想要的,只要您使用[.id] 而不是.id,例如map( select([.id] | inside(["1","3"])) )
  • 这就是我最终做到的:jqplay.org/s/0D_2M9OPfN

标签: json jq


【解决方案1】:

试试这个:

.[] | select(.id == "3" or .id == "2") | .name,.value

Demo

【讨论】:

  • 感谢 jqplay.org!太方便了!
  • 正如在其他类似的answer 中建议的类似问题,它可以进一步简化为.[] | select(.id == ("3", "2")) | .name,.value
  • 使用.id == ("3","2") 时要注意的一点是,它会比.id == "3" or .id == "2" 进行更多的比较。您可以通过添加 debug 来查看这一点,例如试试.[] | select(.id == "3" or .id == "2" | debug) | .name,.value.[] | select(.id == ("3", "2") | debug) | .name,.value
  • 要解决@jq170727 提出的问题,只需将对select 的调用封装在对first 的调用中(在jq 1.4 及更高版本中可用),例如first(select(.id == ("3","2")))
  • 也许这是我的 jq 版本(1.5 osx/homebrew),但与.[] | select(.id == ("3","2") | debug) | .name, .value 相比,.[] | first(select(.id == ("3","2") | debug)) | .name, .value 的调试调用次数并没有减少。我还观察到 jqplay.org/s/9wQ-m15wjr 上的 6 次(2 次测试 * 3 行)调用
猜你喜欢
  • 2021-04-09
  • 2018-04-11
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多