如何向jq文件传递键参数?解决分组统计键参数字符串化问题
解决jq动态路径分组统计的问题
你遇到的问题本质是:通过命令行传入的分组路径是字符串,而group_by()需要的是每个条目对应路径的实际值,直接用字符串作为分组依据当然会失效。下面给你两种可行的解决方案,一步步帮你搞定:
方法一:用getpath()解析字符串路径(推荐)
这种方法适合你习惯传入.header.messageType这类带点的字符串路径的场景。
1. 编写count_by.jq脚本
# 把字符串路径转成jq能识别的路径数组,再获取对应值 group_by(getpath(($group | ltrimstr(".") | split(".")))) | map({ group: .[0] | getpath(($group | ltrimstr(".") | split("."))), cnt: length })
这里的逻辑拆解:
$group | ltrimstr("."):去掉路径开头的点(比如把.header.messageType变成header.messageType)split("."):把字符串按点分割成路径数组(比如["header", "messageType"])getpath(...):用路径数组获取当前条目的对应值,作为分组依据
2. 正确调用脚本
注意要使用--arg来传递变量(而不是--args,--args是传递位置参数,变量获取方式不同):
cat my.json | jq --from-file count_by.jq --arg group ".header.messageType"
方法二:直接传递路径数组(更灵活)
如果你的路径比较复杂(比如包含特殊字符的键),可以用--argjson直接传递路径数组:
1. 修改脚本
group_by(getpath($group)) | map({ group: .[0] | getpath($group), cnt: length })
2. 调用方式
cat my.json | jq --from-file count_by.jq --argjson group '["header", "messageType"]'
为什么原来的写法不行?
你之前用--args传入的group和.header.messageType是作为位置参数存在于$ARGS.positional数组里,而且即使拿到了字符串.header.messageType,group_by($group)也只是把每个条目和这个字符串本身比较,而不是去读取条目里对应路径的值——这就是为什么分组结果不对的核心原因。
内容的提问来源于stack exchange,提问作者ScottS
相关产品推荐
相关产品推荐

