jq: использование вложенного имени поля в качестве аргумента командной строки для оператора group_by - PullRequest
0 голосов
/ 28 сентября 2018

Я создаю общий JQ-скрипт group-by (подробности в другом вопросе ), который принимает поле для группировки в качестве аргумента командной строки.

Работает нормальнокогда я группирую по полю верхнего уровня;это не так, когда мне нужно сгруппировать по полю глубоко в иерархии объектов:

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 голосов
/ 28 сентября 2018

Чтобы передать путь в качестве параметра, вы должны использовать запись пути массива (т. Е. Массив строк и / или целых чисел):

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.

...