使用yq对YAML文件中people数组排序并固定pin为首位
解决yq排序数组并保留指定元素在首位的问题
问题场景
现有file.yml内容如下:
--- - foo: bar bing: - bong - bang people: - { name: pin, nicknames: ['pin', 'first'] } - { name: deb, nicknames: ['deb'] } - { name: roger, nicknames: ['roger'] } - { name: kenny, nicknames: ['kenny'] } - { name: annie, nicknames: ['annie'] }
使用yq v4.31.2,需要对people数组按name字段排序,但要求name: pin的对象始终保持在数组首位,期望输出:
--- - foo: bar bing: - bong - bang people: - { name: pin, nicknames: ['pin', 'first'] } - { name: annie, nicknames: ['annie'] } - { name: deb, nicknames: ['deb'] } - { name: kenny, nicknames: ['kenny'] } - { name: roger, nicknames: ['roger'] }
目前已能通过yq '.[].people.[1:] | sort_by(.name)' file.yml切片并排序people数组的后续元素,但不知道如何将结果整合回原文件。
解决方案
直接使用yq的赋值操作,将拆分后的两部分重新组合赋值给people字段,完整命令:
yq '.[].people = (.[].people[:1] + (.[].people[1:] | sort_by(.name)))' file.yml
命令解释
.[].people[:1]:提取people数组的第一个元素(即name: pin的对象).[].people[1:] | sort_by(.name):提取people数组从第二个元素开始的部分,并按name字段排序+:将上述两部分数组拼接起来.[].people = ...:把拼接后的新数组重新赋值给原people字段
执行该命令后,即可得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者remnant24
相关产品推荐
相关产品推荐

