Arrays 使用jq 1.3和内联输出统计JSON数组的分组成员

Arrays 使用jq 1.3和内联输出统计JSON数组的分组成员,arrays,json,jq,Arrays,Json,Jq,我有一个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-

我有一个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作为$p
|将.instance_AZs[]减少为$k({};[$k]+=1)
|密钥_未排序[]为$k
|“\($p)。\($k)。\($k])”
instance_AZs
减少到一个对象,在该对象中,唯一数组元素是其在数组中重复计数的关键,使用它来生成所需的输出


或者,如果您坚持按自己的方式执行此操作,请将组管道连接到插值字符串,而不是映射到
,即参考@hek2mgl的答案。

这是一个令人惊讶的问题,可以与jq 1.5一起使用。非常感谢。有没有办法避免加入?要使它与1.3一起工作,我没有用于测试的
jq-1.3
。字符串插值是否适用于1.3?这是否适用于1.3:
jq'\(.foo)“@hek2mgl是吗does@hek2mgl在字符串插值中不需要
tostring
。表达式返回的任何内容都将插入字符串中。@oguzismail true!已删除(它是以前版本的遗留版本,带有
join