使用JQ和bash按用户ID计数帖子

时间:2016-10-10 13:57:47

标签: json bash count jq

我正在尝试计算用户ID 4发布的帖子

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

    curl -s 'http://jsonplaceholder.typicode.com/posts' |  jq '.[] |select(.userId==4) | length'

输出:

   4

   4

   4

   4

   4

   4

   4

   4

   4

   4

数据可以在网址找到,但这里有一个快速的样本

    [
      {
        "userId": 1,
        "id": 1,
        "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
        "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
      },
      {
        "userId": 1,
        "id": 2,
        "title": "qui est esse",
        "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
      },
      {
        "userId": 1,
        "id": 3,
        "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
        "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
      }]

我知道userId 4有10个帖子所以它拿起它我觉得长度部分有问题吗?

它应该只计算userId的帖子并显示10

的答案

编辑::如果你认为这个问题是可以接受的,请你进行投票,这样我就能获得声誉等等。

5 个答案:

答案 0 :(得分:1)

试试这个:

$ curl -s 'http://jsonplaceholder.typicode.com/posts' |
    jq '[ .[] |select(.userId==4) ] | length'
10

外部[ ]将命令结果转换为可以应用length的数组。

答案 1 :(得分:0)

由于您要在每行打印userId:4的每个实例,您可以将其传送到wc -l以获取计数。

curl -s 'http://jsonplaceholder.typicode.com/posts' |  jq '.[] |select(.userId==4) | length' | wc -l

output: 10

答案 2 :(得分:0)

一个非常短的替代方案:

 map(select(.userId==4))|length

一个方便的def可以保留(可能在〜/ .jq中):

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

您可以使用的过滤器是:

 count(.[]|select(.userId==4))

(少了一个非空白字符: - )

答案 3 :(得分:0)

以下是使用reduce的解决方案:

jq 'reduce .[] as $i(0;if $i.userId==4 then .+1 else . end)' \
  <(curl -s http://jsonplaceholder.typicode.com/posts)

答案 4 :(得分:-1)

您也可以尝试:

curl -s 'http://jsonplaceholder.typicode.com/posts' |  jq 'group_by(.userId)|.[]|{userId: .[0].userId, count: (.|length)}|select(.userId==4)'

以更通用的方式,您可以使用:

curl -s 'http://jsonplaceholder.typicode.com/posts' |  jq 'group_by(.userId)|.[]|{userId: .[0].userId, count: (.|length)}'

计算每个userId的帖子,另一个变体可以是:

curl -s 'http://jsonplaceholder.typicode.com/posts' |  jq 'group_by(.userId)|map({(.[0].userId|tostring): (.|length)})'

以格式[{userId: count},...]

返回结果