我有一个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"
]
能否请您建议如何产生所需的输出?
这是一种方法:
jq -r '.[]|.ASGname as $g|.instance_AZs|group_by(.)[]|"\($g).\(.[0]).\(length)"' file.json
.[]
| .ASGname as $p
| reduce .instance_AZs[] as $k ({}; .[$k]+=1)
| keys_unsorted[] as $k
| "\($p).\($k).\(.[$k])"
将instance_AZs
减少到一个对象,其中唯一的数组元素是数组中重复计数的关键,用它来产生所需的输出。
或者,如果你坚持按照你的方式做到这一点,将组分组为插值字符串而不是map
,即参考@ hek2mgl的答案。