jq 获取字符串中元素的计数并将其放入字典列表
jq to get count of a element in a string and make it to a dict list
问题 1) 我想计算这个字符串中的所有字典,下面的示例输入的结果应该是 3
。
问题2)我想统计name == foo,结果应该是2
问题3)我想得到{"foo":["b","c"],"go":["d"]}
示例输入:
{
"name": "foo",
"title": "b"
}
{
"name": "foo",
"title": "c"
}
{
"name": "go",
"title": "d"
}
您有一个 object 流。您需要将所有这些文档归为一个,以便共同处理它们。
有两种方法可以实现:
- 使用“slurp 模式”(
--slurp
/-s
)
- 使用
[ inputs ]
,需要-null-input
/-n
。
流中的文档数:
jq -sr length
jq -nr '[ inputs ] | length'
根 object 对键 name
的值为 foo
的文档数:
jq -sr 'map( select( .name == "foo" ) ) | length'
jq -nr '[ inputs | select( .name == "foo" ) ] | length'
按名称分组的标题:
jq -s 'reduce .[] as $doc ( {}; .[ $doc.name ] += [ $doc.title ] )'
jq -n 'reduce inputs as $doc ( {}; .[ $doc.name ] += [ $doc.title ] )'
为了避免 slurping 和任何其他创建数组以获取其长度的方法,您可以使用以下面向流的计数函数:
def count(s): reduce s as $x (0; .+1);
例如,而不是:
jq -nr '[ inputs ] | length'
你可以这样写:
jq -n -f count.jq
其中 count.jq 包含:
def count(s): reduce s as $x (0; .+1);
count(inputs)
同样,而不是
jq -nr '[ inputs | select( .name == "foo" ) ] | length'
您将使用相同的“def”:
count(inputs | select( .name == "foo" ))
问题 1) 我想计算这个字符串中的所有字典,下面的示例输入的结果应该是 3
。
问题2)我想统计name == foo,结果应该是2
问题3)我想得到{"foo":["b","c"],"go":["d"]}
示例输入:
{
"name": "foo",
"title": "b"
}
{
"name": "foo",
"title": "c"
}
{
"name": "go",
"title": "d"
}
您有一个 object 流。您需要将所有这些文档归为一个,以便共同处理它们。
有两种方法可以实现:
- 使用“slurp 模式”(
--slurp
/-s
) - 使用
[ inputs ]
,需要-null-input
/-n
。
流中的文档数:
jq -sr length
jq -nr '[ inputs ] | length'
根 object 对键 name
的值为 foo
的文档数:
jq -sr 'map( select( .name == "foo" ) ) | length'
jq -nr '[ inputs | select( .name == "foo" ) ] | length'
按名称分组的标题:
jq -s 'reduce .[] as $doc ( {}; .[ $doc.name ] += [ $doc.title ] )'
jq -n 'reduce inputs as $doc ( {}; .[ $doc.name ] += [ $doc.title ] )'
为了避免 slurping 和任何其他创建数组以获取其长度的方法,您可以使用以下面向流的计数函数:
def count(s): reduce s as $x (0; .+1);
例如,而不是:
jq -nr '[ inputs ] | length'
你可以这样写:
jq -n -f count.jq
其中 count.jq 包含:
def count(s): reduce s as $x (0; .+1);
count(inputs)
同样,而不是
jq -nr '[ inputs | select( .name == "foo" ) ] | length'
您将使用相同的“def”:
count(inputs | select( .name == "foo" ))