diff --git a/pkg/yqlib/doc/operators/pick.md b/pkg/yqlib/doc/operators/pick.md index fbe9bd95..935a2232 100644 --- a/pkg/yqlib/doc/operators/pick.md +++ b/pkg/yqlib/doc/operators/pick.md @@ -26,6 +26,30 @@ myMap: cat: meow ``` +## Pick keys from map, included all the keys +We create a map of the picked keys plus all the current keys, and run that through unique + +Given a sample.yml file of: +```yaml +myMap: + cat: meow + dog: bark + thing: hamster + hamster: squeak +``` +then +```bash +yq '.myMap |= pick( (["thing"] + keys) | unique)' sample.yml +``` +will output +```yaml +myMap: + thing: hamster + cat: meow + dog: bark + hamster: squeak +``` + ## Pick indices from array Note that the order of the indices matches the pick order and non existent indices are skipped. diff --git a/pkg/yqlib/operator_pick_test.go b/pkg/yqlib/operator_pick_test.go index 0111a357..6f47f7e3 100644 --- a/pkg/yqlib/operator_pick_test.go +++ b/pkg/yqlib/operator_pick_test.go @@ -14,6 +14,15 @@ var pickOperatorScenarios = []expressionScenario{ "D0, P[], (!!map)::myMap: {hamster: squeak, cat: meow}\n", }, }, + { + description: "Pick keys from map, included all the keys", + subdescription: "We create a map of the picked keys plus all the current keys, and run that through unique", + document: "myMap: {cat: meow, dog: bark, thing: hamster, hamster: squeak}\n", + expression: `.myMap |= pick( (["thing"] + keys) | unique)`, + expected: []string{ + "D0, P[], (!!map)::myMap: {thing: hamster, cat: meow, dog: bark, hamster: squeak}\n", + }, + }, { description: "Pick splat", skipDoc: true,