получить подмножество ключей и обернуть вывод в список, используя jq - PullRequest
2 голосов
/ 30 апреля 2019

Предположим, у нас есть следующие записи:

[
{"k1": "v1", "k2": "v2"},
{"k1": "v1", "k2": "v2"},
{"k1": "v1", "k2": "v2"}
]

и мы хотим сохранить только подмножество клавиш, например k1

Какую операцию мы должны сделать, чтобы получить следующий вывод?

[
{"k1": "v1"},
{"k1": "v1"},
{"k1": "v1"}
]

Я пытался сделать jq '.[] | { "k1": .k1 }', но он возвращает

{"k1": "v1"}
{"k1": "v1"}
{"k1": "v1"}

Также попытался сделать jq '.[] | { "k1": .k1 }' | jq '[inputs]', но по какой-то причине он удаляет первую строку

[
{"k1": "v1"},
{"k1": "v1"}
]

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Используйте map, он применяет фильтр ко всем элементам массива.

$ jq 'map({k1})' file
[
  {
    "k1": "v1"
  },
  {
    "k1": "v1"
  },
  {
    "k1": "v1"
  }
]
0 голосов
/ 30 апреля 2019

и, альтернативно, вы могли бы использовать Unix-инструмент Walk-Path для JSON: jtc:

bash $ <file.json jtc -w'<k1>l:' -pp
[
   {
      "k1": "v1"
   },
   {
      "k1": "v1"
   },
   {
      "k1": "v1"
   }
]
bash $ 

- рекурсивно обойти все записигде метка k1 и очистка (-pp) всех остальных

Или, просто обойдите все элементы с меткой k1, оберните обойденные элементы в массив (-j) с метками-l и не объединяйте их (-n):

bash $ <file.json | jtc -w'<k1>l:' -jln
[
   {
      "k1": "v1"
   },
   {
      "k1": "v1"
   },
   {
      "k1": "v1"
   }
]
bash $ 

PS> Раскрытие информации: я создатель jtc инструмента

...