json 选择与JQ中bash数组中的元素匹配的值

l7wslrjt  于 2023-03-04  发布在  其他
关注(0)|答案(4)|浏览(152)

我需要运行一个脚本,其中有一个id数组,一个json,其中包含具有这些id的元素和更多的数据。我需要过滤/选择与数组中的值匹配的值。由于某种原因,当直接在bash上运行时,我得到了很好的结果,其中一些我已经尝试过了。但不是在运行脚本时。不确定这是否相关,或者我在从一个传递到另一个时做错了什么
例如,如果我有一个json文件

[
 {
   "id": 1,
   "value": 10
 },   
 {
   "id": 2,
   "value": 100
 },
 {
   "id": 3,
   "value": 5
 },
 {
   "id": 4,
   "value": 17
 },
 {
   "id": 5,
   "value": 84
 }
]

和以下数组:

IDS=(1 2 3 4)

我需要检索值10、100、5和17。
我试过一些方法:

VALUES=$(jq --argjson IDS "$IDS" '.[] | select( $IDS =~ .id ) | .value' file.json)
VALUES=$(jq --argjson IDS "$IDS" '.[] | select( ${IDS[*]} =~ .id ) | .value' file.json)
# I have certainty that IDS will always have 4 elements, no more no less
VALUES=$(jq --argjson IDS "$IDS" '.[] | select( .id == ${IDS[0]} | .id == ${IDS[1]} | .id == ${IDS[2]} | .id == ${IDS[3]} ) | .value' file.json)

在所有情况下,我都得到'意外的INVALID_CHARACTER(Unix shell引用问题?)
同样,在最后一个例子中,当我用硬编码的数字替换${IDS [n ]}时,它工作得很好,但是,我不会在每次运行中得到相同的数字,所以我需要将其参数化。
任何帮助都很好!
编辑
谢谢大家的解答。我暂时保留了我最理解的一个,但是我真的很满意所有的解答

fykwrbwg

fykwrbwg1#

使用--arg,然后将Bash数组转换为JSON整数:

($IDS | split(" ") | map(tonumber)) as $PIDS

合并select()index()

jq \
    --arg IDS "${IDS[*]}" \
    '($IDS | split(" ") | map(tonumber)) as $PIDS | 
        .[] | select([.id] | index($PIDS[])).value' \
input

给出:

10
100
5
17
lmvvr0a8

lmvvr0a82#

一种方法是创建可接受ID的Map,然后在其中进行查找:

ids=( 1 2 3 4 )

jq --arg idstr "${ids[*]}" '
  ([$idstr | split(" ")[] | {"key": ., "value": true}] | from_entries) as $idmap
  | .[] | select($idmap[.id | tostring]).value'
wgmfuz8q

wgmfuz8q3#

或者,使用--args "${ids[@]}"ids个单独的数组元素作为参数传递给jq,然后使用mapfile将值读回到bash数组中:

#!/usr/bin/env bash

ids=( 1 2 3 4 )

mapfile -t values < <(

jq '
  (
    [$ARGS.positional[] | {"key": ., "value": true}] |
    from_entries
  ) as $idmap |
  .[] |
  select($idmap[.id | tostring]).value' \
  input.json \
  --args "${ids[@]}" 
)

# Debug show content of values array
declare -p values

样本输出:

declare -a values=([0]="10" [1]="100" [2]="5" [3]="17")
myzjeezk

myzjeezk4#

你要找的东西是这样的:

$ IDS=(1 2 3 4)
$ jq '.[] | select(IN(.id; $ARGS.positional[])) .value' file.json --jsonargs "${IDS[@]}"
10
100
5
17

相关问题