【问题标题】:jq to get count of a element in a string and make it to a dict listjq 获取字符串中元素的计数并将其放入字典列表
【发布时间】:2021-12-20 05:54:10
【问题描述】:

问题1)我想统计这个字符串中的所有dict,结果应该是3下面的示例输入。

问题2)我要数name == foo,结果应该是2

问题3)我想得到{"foo":["b","c"],"go":["d"]}

示例输入:

{
  "name": "foo",
  "title": "b"
}
{
  "name": "foo",
  "title": "c"
}
{
  "name": "go",
  "title": "d"
}

【问题讨论】:

  • 你做了什么尝试,在这个过程中你的努力是如何失败的?
  • 我不知道如何用 jq 将其覆盖到 dict 列表中。如果可以的话就很容易了

标签: jq


【解决方案1】:

你有一个对象流。您需要将所有这些文档归为一个以共同处理它们。

有两种方法可以实现:

  • 使用“slurp 模式”(--slurp/-s)
  • 使用[ inputs ],需要-null-input/-n

流中的文档数:

jq -sr length
jq -nr '[ inputs ] | length'

根对象的值foo 对应键name 的文档数:

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

【讨论】:

    【解决方案2】:

    为避免 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" ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2023-01-25
      • 2023-03-28
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多