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

Counting posts by user id with JQ and bash

我正在尝试计算由用户 ID 4

创建的 post

这是我目前所拥有的

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

输出:

   4

   4

   4

   4

   4

   4

   4

   4

   4

   4

数据可以在 url 找到,但这里是一个快速示例

    [
      {
        "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 个 post 所以它把它们捡起来 我认为长度部分有问题?

它应该只按 userId 计算 posts 并显示答案 10

编辑 :: 如果您认为这个问题可以接受,请您投票,以便我获得声誉等

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

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

output: 10

试试这个:

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

外部 [ ] 将命令结果转换为数组,您可以在其上应用 length

一个更短的备选方案:

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

一个方便的 def 可以随身携带(可能在 ~/.jq 中)是:

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

您随后可以使用的过滤器是:

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

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

您也可以试试:

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)})'

return 格式为 [{userId: count},...]

的结果

这是一个使用 reduce 的解决方案:

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