JQ 查询使用传递到参数的外部数组上的成员资格条件来过滤条目(使用 --arg)

问题描述 投票:0回答:1

给定一个测试文件test.json:

[
  {
    "name": "foo",
    "key1": "val3,val2,val1",
    "category": "thefoocategory"
  },
  {
    "name": "bar",
    "key1": "val2",
    "category": "thebarcategory"
  }
]

并给出:

str="val1,val2,val3"

我想从文件中过滤“name”属性,其关联的“key1”属性(被视为数组)保存被视为数组的“str”的所有值(元素顺序无关紧要)[foo ]

我尝试使用更简单的用例(在测试文件中用“X”替换“valX”),但我坚持指定成员资格条件。

类似:

cat test1 | jq -r --arg v "1,2,3" '[.[] | select($v | split(",") | all((.key1 | split(",")) | index(.) != null))]'

它失败了(无法用字符串“key1”索引字符串),但我真的无法弄清楚为什么用 [1,2,3] 替换

(.key1|split(","))
会产生结果。

arrays filter jq membership
1个回答
0
投票

您可以将列表以逗号分隔成一个数组,然后对其进行排序。这样,任何先前的订单都被视为统一。与同等对待的所有

.key1
值进行比较。

str="val1,val2,val3"
jq --arg str "$str" '
  ($str / "," | sort) as $arr
  | map(select(.key1 / "," | sort == $arr).name)
'
[
  "foo"
]

演示

© www.soinside.com 2019 - 2024. All rights reserved.