使用 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)
我正在尝试计算由用户 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)