使用 jq :如何在没有重复代码的情况下在其他字段中使用相同的搜索?

时间:2021-02-04 10:58:40

标签: json field jq

例如,我有以下 json 文件:

{
    "FOO": {
        "name": "Donald",
        "location": "Stockholm"
    },
    "BAR": {
        "name": "Walt",
        "location": "Stockholm"
    },
    "BAZ": {
        "name": "Jack",
        "location": "Whereever"
    }
}

我有这个 jq 命令:

cat json | jq .[] | {newname : select(.location=="Stockholm") | .name , contains_w : select(.location=="Stockholm") | .name  | startswith("W")} 

所以我得到了结果:

{
  "newname": "Donald",
  "contains_w": false
}
{
  "newname": "Walt",
  "contains_w": true
}

我的问题是:有没有办法DRY我的命令?
我的意思是如何在没有重复部分的情况下获得相同的结果:

select(.location=="Stockholm") | .name 

如何重用 newname 字段的结果?

我有一个非常大的文件要处理,所以我不想浪费时间和资源。

1 个答案:

答案 0 :(得分:0)

您在对象构建过程中进行了多次过滤。您可以先过滤,然后在过滤后的列表上进行构建,例如。

map(select(.location=="Stockholm")) 
  | map({newname: .name, contains_w: (.name | startswith("W"))})

https://jqplay.org/s/aXjlgOEDnb