首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在yq中按字典值过滤列表?

如何在yq中按字典值过滤列表?
EN

Stack Overflow用户
提问于 2022-03-14 18:16:48
回答 2查看 2.2K关注 0票数 1

我在用https://mikefarah.gitbook.io/yq/。如何根据特定键下的列表中的特定值筛选字典列表?在下面的示例中,我希望按条件筛选布局列表"iso3166列表包含值'GB'“。

示例

一个模型和三个布局的xkbcli list的Yaml输出(浓缩)

代码语言:javascript
复制
models:
- name: pc86
  vendor: Generic
  description: Generic 86-key PC

layouts:
- layout: 'ch'
  variant: ''
  brief: 'de'
  description: German (Switzerland)
  iso639: ['deu', 'gsw']
  iso3166: ['CH']
- layout: 'gb'
  variant: 'gla'
  brief: 'gd'
  description: Scottish Gaelic
  iso639: ['eng', 'gla']
  iso3166: ['GB', 'CA']
- layout: 'gb'
  variant: 'colemak'
  brief: 'en'
  description: English (UK, Colemak)
  iso639: ['eng']
  iso3166: ['GB']

期望输出:两个“GB”布局

代码语言:javascript
复制
- layout: 'gb'
  variant: 'gla'
  brief: 'gd'
  description: Scottish Gaelic
  iso639: ['eng', 'gla']
  iso3166: ['GB', 'CA']
- layout: 'gb'
  variant: 'colemak'
  brief: 'en'
  description: English (UK, Colemak)
  iso639: ['eng']
  iso3166: ['GB']

到目前为止,我已经尝试过yq ".layouts"

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-14 18:29:19

使用mapselect

代码语言:javascript
复制
# Selects by .layout
yq '.layouts | map(select(.layout == "gb"))'

# Selects by .iso3166[]
yq '.layouts | map(select(.iso3166[] == "GB"))'
代码语言:javascript
复制
- layout: 'gb'
  variant: 'gla'
  brief: 'gd'
  description: Scottish Gaelic
  iso639: ['eng', 'gla']
  iso3166: ['GB', 'CA']
- layout: 'gb'
  variant: 'colemak'
  brief: 'en'
  description: English (UK, Colemak)
  iso639: ['eng']
  iso3166: ['GB']
票数 3
EN

Stack Overflow用户

发布于 2022-03-14 18:31:10

您需要在select列表中使用iso3166来查看是否存在与"GB"匹配的内容。要更新原始layouts列表,请使用|=而不是仅使用|

代码语言:javascript
复制
yq '.layouts | map(select( .iso3166[] == "GB" ))'

注意:由于4.18.1,yq的'eval/e‘命令是默认命令,不再需要指定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71472419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档