代码之家  ›  专栏  ›  技术社区  ›  dg99

JSON密钥全局绑定

  •  3
  • dg99  · 技术社区  · 7 年前

    jq 手动页面有几个输出格式的示例,特别是一些快捷方式,用于您只想完全响应输入JSON中的内容。

    如果我想准确地回显输入中的内容,但仅针对匹配特定模式的键,该怎么办?

    例如,给定这样的输入。。。

    [
    {"Name":"Widgets","Size":10,"SymUS":"Widg","SymCN":"Zyin","SymJP":"Kono"},
    {"Name":"Blodgets","Size":400,"SymUS":"Blodg","SymAU":"Blod","SymJP":"Kado"},
    {"Name":"Fonzes","Size":11,"SymRU":"Fyet","SymBR":"Foao"}
    ]
    

    假设我要选择 Name 以“ets”结尾,然后显示 名称 以及表单的所有属性 Sym* 。关于这些属性,我所知道的只是每个JSON对象将有一个或多个属性,并且名称的格式为 Sym 后跟两个字母的ISO国家代码。

    我只想这样做:

    jq '.[] | select(.Name | endswith("ets")) | {Name, Sym*}'
    

    但这不是一件事。

    这难道不是什么 jq公司 是否设计为在一次操作中处理?我是否应该首先遍历文件以收集所有可能的密钥,然后通过 slurpfile ?

    1 回复  |  直到 7 年前
        1
  •  3
  •   peak    7 年前

    简单解决问题的关键是 to_entries ,如在线手册中所述。对于您的示例数据,以下过滤器根据我所理解的期望生成如下所示的输出:

    .[]
    | select(.Name | test("ets$"))
    | {Name} + (to_entries | map(select(.key|test("^Sym"))) | from_entries)
    

    您可能希望优化regex测试,和/或进行其他小的调整。

    输出:

    {
      "Name": "Widgets",
      "SymUS": "Widg",
      "SymCN": "Zyin",
      "SymJP": "Kono"
    }
    {
      "Name": "Blodgets",
      "SymUS": "Blodg",
      "SymAU": "Blod",
      "SymJP": "Kado"
    }