我想编写一个简单的jq文件,该文件可以让我计算按指定键分组的项目。
我希望脚本内容也类似:
group_by($group) | map({group: $group, cnt: length})
并调用它类似
cat my.json | jq --from-file count_by.jq --args group .header.messageType
无论我尝试了什么,该参数始终以字符串结尾,不能用作键。
答案 0 :(得分:1)
由于您未遵循minimal complete verifiable example
准则,要知道解决问题的最佳方法是有点困难,但是无论采用哪种方法,都必须牢记--arg始终以JSON字符串传递。除非片段是JSON字符串,否则不能用于传递jq程序片段。
因此,我们考虑一个选项:传递一个JSON对象,该对象表示可以在程序中使用的路径。
因此调用可以是:
jq -f count_by.jq --argjson group '["header", "messageType"]'
,程序将以:
开头group_by(getpath($group)) | ...
如果您真的想传递诸如.header.messageType
之类的参数,则有一种方法:将字符串$ group转换为jq路径:
($group|split(".")|map(select(length>0))) as $path
因此,您的jq过滤器将如下所示:
($group|split(".")|map(select(length>0))) as $path
| group_by(getpath($path)) | map({group: $group, cnt: length})
如果您想要快速的bash解决方案,但需要注意许多事项:
group=".header.messageType"
jq 'group_by('"$group"') | map({group: "'"$group"'", cnt: length}'