使用内联输出计数带有jq 1.3的JSON数组的成员

问题描述 投票:3回答:2

我有一个JSON文件:

[
  {
    "instance_AZs": [
        "us-east-1b",
        "us-east-1b",
        "us-east-1b",
        "us-east-1c",
        "us-east-1c",
        "us-east-1a",
        "us-east-1a",
        "us-east-1c",
        "us-east-1b",
        "us-east-1a",
        "us-east-1a",
        "us-east-1c",
        "us-east-1a",
        "us-east-1b",
        "us-east-1b",
        "us-east-1c",
        "us-east-1c",
        "us-east-1b"
    ],
    "ASGname": "myapp"
  }
]

期望的输出是:

myapp.us-east-1a.5
myapp.us-east-1b.7
myapp.us-east-1c.6

至于我可以使用jq 1.3语法,我编写了这段代码:

cat file.json | jq -r '.[] | .ASGname, (.instance_AZs | group_by(.) | map(. | length , (. | unique ) [] ))'

产生输出:

myapp
[
  5,
  "us-east-1a",
  7,
  "us-east-1b",
  6,
  "us-east-1c"
]

能否请您建议如何产生所需的输出?

arrays json jq
2个回答
2
投票

这是一种方法:

jq -r '.[]|.ASGname as $g|.instance_AZs|group_by(.)[]|"\($g).\(.[0]).\(length)"' file.json

2
投票
.[]
| .ASGname as $p
| reduce .instance_AZs[] as $k ({}; .[$k]+=1)
| keys_unsorted[] as $k
| "\($p).\($k).\(.[$k])"

instance_AZs减少到一个对象,其中唯一的数组元素是数组中重复计数的关键,用它来产生所需的输出。

或者,如果你坚持按照你的方式做到这一点,将组分组为插值字符串而不是map,即参考@ hek2mgl的答案。

© www.soinside.com 2019 - 2024. All rights reserved.