linux 如何在jq中合并多个结果?默认提供的数组构造不是很方便

ubby3x7f  于 5个月前  发布在  Linux
关注(0)|答案(2)|浏览(77)

例如,有一个group_by_count脚本。

jq 'map(select(.sno|startswith("20")))|group_by(.school)[]|{k:.[0].school,len:length}'

字符串
此命令的输出有多个结果,如:

{k:xxx,len:111}{k:aaa,len:22}...


如果你想将这些结果合并到一个数组中,你需要用括号[] Package 整个表达式。例如,你可以这样写:

jq '[map(select(.sno|startswith("20")))|group_by(.school)[]|{k:.[0].school,len:length}]'


请注意顶层[]
这可能有点麻烦,特别是在移动光标可能不方便的终端环境中。是否有更简单的方法,例如使用命令:

jq 'map(select(.sno|startswith("20")))|group_by(.school)[]|{k:.[0].school,len:length} | merge'


这样,对于用户来说,这将是一个“追加”的问题,而不需要移动光标。
预期产出:

[
  {
    "k": "xxx",
    "len": 111
  },
  {
    "k": "aaa",
    "len": 22
  }
]

hfwmuf9z

hfwmuf9z1#

如果要将这些结果合并到一个数组中,则需要用方括号[]将整个表达式括起来。
避免这样做的一种方法是避免在调用group_by之后使用[],因此过滤器将以以下方式结束:

group_by(.school) | map({k:.[0].school, len:length})

字符串
然而,由于jq程序无论如何都很长,您可能应该考虑将其放入文件并使用jq的-f选项。
值得一提的是,如果您在命令提示符下工作并发现自己处于所描述的情况,您总是可以简单地将流通过管道传输到jq -s

cetgtptt

cetgtptt2#

如果你在POSIX shell中工作,你可以将输出管道到另一个jq调用:

jq '..... your long jq program producing a stream of object .....' | jq -s

字符串
-s是“slurp”,它将把输入流中的所有对象放入一个数组中。An alternative is appending jq -n '[inputs]'

相关问题