我正在使用 jq 来解析一个 json 文件 -

json 文件看起来像 -

{ 
  "values": [ 
    { 
      "email": "user1@domain.com", 
      "id": "USER1_ID" 
    },{ 
      "email": "user2@domain.com", 
      "id": "USER2_ID" 
    }, 
    . 
] 
} 

我能够像下面这样打印/遍历 id

for k in $(cat input.json | jq .values | jq .[].id); do 
    echo $k 
done 

这会按预期打印每个单独的 ID。

但是,我想要的是在循环中访问电子邮件和 id。

我试着给 SHELL 变量赋值,如下所示 -

emails=$(cat input.json | jq .values | jq .[].email) 
ids=$(cat input.json | jq .values | jq .[].id) 

这在大多数情况下都可以工作,但 ids 也可以有空格,这会破坏它。

我基本上必须使用 2 个 for 循环,一个用于 email,另一个用于 id,并在循环中为数组赋值

   i=0 
    for k in $(cat input.json | jq .values | jq .[].id); do 
            ids[$i]=$k 
            i=$(($i +1))  
        done 

i=0 
for k in $(cat input.json | jq .values | jq .[].email); do 
        emails[$i]=$k 
        i=$(($i +1))  
    done 

一旦我在数组中拥有两个值,我就可以并行遍历它们。

我不是 shell 专家,所以我想知道是否有任何巧妙的方法可以用更少的循环/代码行来做到这一点。

感谢您的帮助!

请您参考如下方法:

您可以将每个电子邮件 ID 对作为逗号分隔的列表从 JQ 输出,并在 while 循环中将它们读入变量,如下所示:

while IFS=',' read -r email id; do 
  echo "$email" 
  echo "$id" 
done <<EOF 
$(jq -r '.values[] | "\(.email),\(.id)"' file) 
EOF 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!