代码之家  ›  专栏  ›  技术社区  ›  jaundiced

YQ-如果匹配列表中的至少一个元素,如何按字段值筛选数组

  •  0
  • jaundiced  · 技术社区  · 1 年前

    明确地 https://github.com/mikefarah/yq ) 4.35+

    我有一个逗号分隔的术语字符串,如果字段值是其中一个术语,我想筛选出一个列表。

    Ex)给定以下输入:

    - name: bob
      age: 12
    - name: jen
      age: 22
    - name: mork
      age: 4003
    

    包括其元素 name 字段值作为的子字符串存在 "jen,mork" 使得输出是:

    - name: jen
      age: 22
    - name: mork
      age: 4003
    

    我也可以将这些术语表示为字符串数组,即。 ["jen", "mork"]

    因此,相当于:

    yq 'filter("jen,mork" | contains(.name))' array.yaml
    # Though I'm not sure how `contains` gets the original array context
    # or
    yq 'filter(.name in ["jen", "mork"])' array.yaml
    

    我意识到这可以通过构建 or 设置,如下所示:

    yq 'filter(.name == "jen" or .name == "mork"])' array.yaml
    

    但我希望有更优雅的。

    我真的不确定该尝试什么,因为这似乎是操作员想要如何工作的倒退。

    1 回复  |  直到 1 年前
        1
  •  0
  •   pmf    1 年前

    只需构建一个流,比较就会自动迭代其项:

    yq 'filter(.name == ("jen", "mork"))' array.yaml
    

    要导入列表,请使用环境变量,然后 env 要访问它:

    list='["jen", "mork"]' yq 'filter(.name == (env(list) | .[]))' array.yaml
    

    使用yq v4.44.2,您可以缩短为 .name == env(list)[] .

    输出

    - name: jen
      age: 22
    - name: mork
      age: 4003