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" ))