繁体   English   中英

bash shell script jq 获取一个字段并进行统计

[英]bash shell script jq Get a field and make statistics

我想计算“adminLock”等于 1 的“域”的数量。

这是我的 json 数据结构:

{
  "code": 0,
  "message": "成功",
  "data": {
    "recordCount": "128",
    "pageSize": 100,
    "page": 1,
    "pageCount": 2,
    "data": [
      {
        "domainsID": "173652434",
        "nsGroupID": "199",
        "groupID": "78987",
        "domains": "dome1.com",
        "state": 3,
        "userLock": 0,
        "adminLock": 0,
        "view_type": "1"
      },
      {
        "domainsID": "173205836",
        "nsGroupID": "199",
        "groupID": "78987",
        "domains": "dome2.com",
        "state": 3,
        "userLock": 0,
        "adminLock": 1,
        "view_type": "1"
      },
      {
        "domainsID": "173205812",
        "nsGroupID": "199",
        "groupID": "78987",
        "domains": "dome3.com",
        "state": 3,
        "userLock": 0,
        "adminLock": 0,
        "view_type": "1"
      },
      {
        "domainsID": "173203610",
        "nsGroupID": "199",
        "groupID": "78987",
        "domains": "dome4.com",
        "state": 3,
        "userLock": 0,
        "adminLock": 1,
        "view_type": "1"
      },
      {
        "domainsID": "173203210",
        "nsGroupID": "199",
        "groupID": "78987",
        "domains": "dome5.com",
        "state": 3,
        "userLock": 0,
        "adminLock": 1,
        "view_type": "1"
      },
      {
        "domainsID": "173203131",
        "nsGroupID": "199",
        "groupID": "78987",
        "domains": "dome6.com",
        "state": 3,
        "userLock": 0,
        "adminLock": 1,
        "view_type": "1"
      },
      {
        "domainsID": "173203074",
        "nsGroupID": "199",
        "groupID": "78987",
        "domains": "dome7.com",
        "state": 3,
        "userLock": 0,
        "adminLock": 1,
        "view_type": "1"
      }
    ],
    "nextPage": 2
  }
}

这是我到目前为止所拥有的:

'.data.data[] | select(.adminLock == 1) | .domains'

我可以得到.domains的值,但是我怎么计算它出现了多少次呢?

补充

我用的脚本是 bash shell 这个命令取值,我想在adminLock=1的情况下统计domains的值,统计域的个数 ———————— 判断adminLock=1是获取域值,并计算总共有多少

要对所有结果项目进行单一计数,请创建一个数组并确定其length

.data.data | map(select(.adminLock == 1)) | length
5

演示

或者迭代和计数,例如使用reduce

reduce (.data.data[] | select(.adminLock == 1)) as $i (0; .+1)
5

演示

第一种方法可能看起来更“自然”,但它实际上构建了一个您最终可能不需要的数组。 因此,如果您只需要计数而不是项目本身,请使用第二种方法。


要根据特定属性(例如.domains的不同值)对项目进行计数,请创建一个相应的结构并如前所示进行计数。 数组方法可以使用group_by对项目进行分组:

.data.data | map(select(.adminLock == 1)) | group_by(.domains)
| map("\(first.domains): \(length)") # create your desired format
[
  "dome2.com: 1",
  "dome4.com: 1",
  "dome5.com: 1",
  "dome6.com: 1",
  "dome7.com: 1"
]

演示

迭代方法依次构建您的 output 结构,例如 object,其属性为字段名称:

reduce (.data.data[] | select(.adminLock == 1)) as $i (
  {}; .[$i.domains] += 1 # create your desired format
)
{
  "dome2.com": 1,
  "dome4.com": 1,
  "dome5.com": 1,
  "dome6.com": 1,
  "dome7.com": 1
}

演示

一般来说,与其构造数组,不如使用面向流的计数方式:

def count(s): reduce s as $x (0;.+1);

在你的情况下,你似乎可以逃脱:

count(.data.data[] | select(.adminLock == 1))

但也许你想检查是否有domains密钥:

count(.data.data[] | select(.adminLock == 1 and has("domains") ))

但是,如果您想计算满足条件的不同域的数量,使用unique可能是最简单的方法:

[.data.data[] | select(.adminLock == 1) | .domains] | unique | length

但是编写unique的面向流版本以避免必须调用unique/0 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM