jq:使用嵌套字段名称作为group_by语句的命令行参数

时间:2018-09-28 14:09:09

标签: command-line jq

我正在构建一个通用的按组JQ脚本(详细说明in another question),该脚本接受要分组的字段作为命令行参数。

按顶级字段分组时效果很好;当我需要按对象层次结构中的一个字段分组时,它不是这样:

jq_group_on_test.json:

{
    "a": {
      "b": {
        "c": "EFG"
      }
    },
    "d": "HIJ"
  }

顶级字段:

jq -s --arg group_by_field "d" '
  group_by(.[$group_by_field])
  | .[]
  | [ (.[0][$group_by_field] ) ]' \
jq_group_on_test.json 

[
  "HIJ"
]

嵌套对象的字段:

jq -s --arg group_by_field "a.b.c" '
  group_by(.[$group_by_field])
  | .[]
  | [ (.[0][$group_by_field] ) ]' \
jq_group_on_test.json

[
  null
]

如果不使用任何变量,则相同的过滤器将起作用:

jq -s '
  group_by(.a.b.c)
  | .[]
  | [ (.[0].a.b.c ) ]' \
jq_group_on_test.json

[
  "DEF"
]

1 个答案:

答案 0 :(得分:1)

要将路径作为参数传递,必须使用数组路径符号(即,字符串和/或整数的数组):

jq -s --argjson group_by_field '["a","b","c"]' '
  group_by( getpath($group_by_field) )
  | .[]
  | [ .[0] | getpath($group_by_field)  ]
' jq_group_on_test.json

请注意使用命令行选项--argjson