我在用https://mikefarah.gitbook.io/yq/。如何根据特定键下的列表中的特定值筛选字典列表?在下面的示例中,我希望按条件筛选布局列表"iso3166列表包含值'GB'“。
示例
一个模型和三个布局的xkbcli list的Yaml输出(浓缩)
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”布局
- 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"
发布于 2022-03-14 18:29:19
使用map和select。
# Selects by .layout
yq '.layouts | map(select(.layout == "gb"))'
# Selects by .iso3166[]
yq '.layouts | map(select(.iso3166[] == "GB"))'- 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']发布于 2022-03-14 18:31:10
您需要在select列表中使用iso3166来查看是否存在与"GB"匹配的内容。要更新原始layouts列表,请使用|=而不是仅使用|
yq '.layouts | map(select( .iso3166[] == "GB" ))'注意:由于4.18.1,yq的'eval/e‘命令是默认命令,不再需要指定。
https://stackoverflow.com/questions/71472419
复制相似问题