yq:对 YAML 文件中数组的切片进行排序

yq: Sorting a slice of an array in a YAML file

提问人:remnant24 提问时间:10/2/2023 更新时间:10/2/2023 访问量:68

问:

样本: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 对对象进行排序,除了哪个应该放在第一位。peoplenamepin

期望输出:

---
- 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 -V
yq (https://github.com/mikefarah/yq/) version v4.31.2

我已经完成了切片和排序,但这只打印了排序后的切片:

❯ yq '.[].people.[1:] | sort_by(.name)' file.yml
- {name: annie, nicknames: ['annie']}
- {name: deb, nicknames: ['deb']}
- {name: kenny, nicknames: ['kenny']}
- {name: roger, nicknames: ['roger']}

不知道如何让其余的人回来,或者我是否走在正确的轨道上。

shell 命令行 yaml slice yq

评论


答:

1赞 pmf 10/2/2023 #1

❯ yq '.[].people.[1:] | sort_by(.name)' file.yml

实际上,仅更改为以更新数组切片,同时保留原始上下文,应该可以完成这项工作(kislyuk/yq 确实如此)。但是,对于 mikefarah/yq,由于某种原因,数组是未排序返回的:||=

yq '.[].people.[1:] |= sort_by(.name)' 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 '.[].people |= .[:1] + (.[1:] | sort_by(.name))' file.yml
---
- 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']}

评论

0赞 remnant24 10/2/2023
正如您的代码片段所示,这没有排序。该输出与输入相同。
1赞 pmf 10/2/2023
@remnant24 您可能会看到该帖子的旧版本。我在 15 分钟前用替代方案更新了它。
0赞 remnant24 10/2/2023
yq '.[].people |= .[:1] + (.[1:] | sort_by(.name))' file.yml钉住它。非常感谢。