You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:53:27