【问题标题】:Filtering one key with the value from another key in jq用jq中另一个键的值过滤一个键
【发布时间】:2020-03-02 22:21:19
【问题描述】:

我有一个 JSON 格式的包数据列表,如下所示:

[
  {
    "Package": "pyasn1",
    "Version": "0.4.6",
    "DownloadURL": "https://files.pythonhosted.org/packages/3d/50/5ce5dbe42eaf016cb9b062caf6d0f38018454756d4feb467de3e29431dae/pyasn1-0.4.6-py2.4.egg"
  },
  {
    "Package": "cachetools",
    "Version": "3.1.1",
    "DownloadURL": "https://files.pythonhosted.org/packages/08/6a/abf83cb951617793fd49c98cb9456860f5df66ff89883c8660aa0672d425/cachetools-4.0.0-py3-none-any.whl"
  }
]

我想生成一个项目列表,其中.DownloadURL 不包含.Version 中的字符串。

我试过了,但它似乎不起作用:

jq '.[]|select(.DownloadURL | contains(.Version)| not)'

我收到以下错误:

jq: error (at <stdin>:11): Cannot index string with string "Version"
exit status 5

我能够做到以下...

jq '.[]|select(.DownloadURL | contains("0.4.6")| not)'

...它给出了我期望的结果:

{
  "Package": "cachetools",
  "Version": "3.1.1",
  "DownloadURL": "https://files.pythonhosted.org/packages/08/6a/abf83cb951617793fd49c98cb9456860f5df66ff89883c8660aa0672d425/cachetools-4.0.0-py3-none-any.whl"
}

有没有办法将.Version 的内容与contains() 函数一起使用,或者有更好的方法吗?我已经设置了a playground with the data here

谢谢!

【问题讨论】:

    标签: json string select jq


    【解决方案1】:

    以下内容对我有用:

    jq '.[]|.Version as $v|select(.DownloadURL | contains($v)| not)'
    
    {
      "Package": "cachetools",
      "Version": "3.1.1",
      "DownloadURL": "https://files.pythonhosted.org/packages/08/6a/abf83cb951617793fd49c98cb9456860f5df66ff89883c8660aa0672d425/cachetools-4.0.0-py3-none-any.whl"
    }
    

    是结果

    【讨论】:

    • 谢谢,这正是我想要的,所以我接受了这个答案。如果你不介意,你能帮我确定我明白这里发生了什么吗?据我所知,您正在选择通过管道select(.) 传递的每条记录,as $x 将记录分配给$x,然后我可以引用.Version 的值。使用$x.Version。对吗?
    • 完全正确,在文档中称为Variable / Symbolic Binding Operator (stedolan.github.io/jq/manual)
    • jq '.[]|.Version as $v|select(.DownloadURL | contains($v)| not)' 显示意图更清晰
    【解决方案2】:

    我想生成一个项目列表,其中 .DownloadURL 不包含 .Version 中的字符串。

    如果你说你想要一个列表的结果,你可以使用map:

    map(select( .Version as $v | .DownloadURL | contains($v) | not))
    

    但是,contains 的语义非常复杂,因此您不妨考虑使用 index 代替:

    map(select( .Version as $v | .DownloadURL | index($v) | not))
    

    【讨论】:

      猜你喜欢
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 2017-04-16
      • 1970-01-01
      相关资源
      最近更新 更多