我正在使用 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