遍历 json 文件并将值检索到 bash 变量中
Looping through a json file and retrieving the values into bash variables
我有一个 json 文件,其中包含以下数据
{"Item": {"ID": {"S": "4869949"},"no":{"N": "2"}}}
我需要从 ID 中检索 S 值,从 no 中检索 N 值,并将它们作为参数放入查询中。查询如下所示:
query --table-name validation \
--key-condition-expression "ID = :v1 AND no = :v2" \
--expression-attribute-values '{":v1": {"S": "${ID}"},":v2": {"N": "${no}"}}' \
--region us-east-1
我试过使用 jq 但无法弄清楚如何读取 json 文件并将值作为参数检索。这是我第一次使用 jq。有人可以帮忙吗?
这是基本的 jq 语法:
$ ID=$(cat data.json | jq .Item.ID.S -r)
$ no=$(cat data.json | jq .Item.no.N -r)
$ echo $ID $no
4869949 2
我建议您阅读类似 https://shapeshed.com/jq-json/ 的内容以更加熟悉。
以下内容可能并不完全符合您的要求,但确实展示了如何避免多次调用 jq,以及命令如何部分地由 jq 构建。换句话说,假设 --key-condition-expression
和 --expression-attribute-values
的模板是固定的,您应该能够根据需要调整以下内容:
假设 bash 或 bash-like shell,并且 data.json 成立:
{"Item": {"ID": {"S": "4869949"},"no":{"N": "2"}}}
我们可以这样写:
ID=ID
no=no
< data.json jq --arg ID "$ID" --arg no "$no" -cr '
.Item
| .ID.S as $v1
| .no.N as $v2
| $v1, $v2, {($v1): {"S": $ID}, ($v2): {"N": $no}}
' | while read -r v1
do
read -r v2
read -r query
echo query --table-name validation \
--key-condition-expression "\"ID = $v1 AND no = $v2\"" \
--expression-attribute-values "'""$query""'" \
--region us-east-1
done
jq 作为模板引擎
如果 Q 中带有 :v1 和 :v2 的模板是可变的,那么您可以使用 jq 作为模板引擎来调整上述内容,jq Cookbook 中涵盖了一个主题:https://github.com/stedolan/jq/wiki/Cookbook#using-jq-as-a-template-engine
我有一个 json 文件,其中包含以下数据
{"Item": {"ID": {"S": "4869949"},"no":{"N": "2"}}}
我需要从 ID 中检索 S 值,从 no 中检索 N 值,并将它们作为参数放入查询中。查询如下所示:
query --table-name validation \
--key-condition-expression "ID = :v1 AND no = :v2" \
--expression-attribute-values '{":v1": {"S": "${ID}"},":v2": {"N": "${no}"}}' \
--region us-east-1
我试过使用 jq 但无法弄清楚如何读取 json 文件并将值作为参数检索。这是我第一次使用 jq。有人可以帮忙吗?
这是基本的 jq 语法:
$ ID=$(cat data.json | jq .Item.ID.S -r)
$ no=$(cat data.json | jq .Item.no.N -r)
$ echo $ID $no
4869949 2
我建议您阅读类似 https://shapeshed.com/jq-json/ 的内容以更加熟悉。
以下内容可能并不完全符合您的要求,但确实展示了如何避免多次调用 jq,以及命令如何部分地由 jq 构建。换句话说,假设 --key-condition-expression
和 --expression-attribute-values
的模板是固定的,您应该能够根据需要调整以下内容:
假设 bash 或 bash-like shell,并且 data.json 成立:
{"Item": {"ID": {"S": "4869949"},"no":{"N": "2"}}}
我们可以这样写:
ID=ID
no=no
< data.json jq --arg ID "$ID" --arg no "$no" -cr '
.Item
| .ID.S as $v1
| .no.N as $v2
| $v1, $v2, {($v1): {"S": $ID}, ($v2): {"N": $no}}
' | while read -r v1
do
read -r v2
read -r query
echo query --table-name validation \
--key-condition-expression "\"ID = $v1 AND no = $v2\"" \
--expression-attribute-values "'""$query""'" \
--region us-east-1
done
jq 作为模板引擎
如果 Q 中带有 :v1 和 :v2 的模板是可变的,那么您可以使用 jq 作为模板引擎来调整上述内容,jq Cookbook 中涵盖了一个主题:https://github.com/stedolan/jq/wiki/Cookbook#using-jq-as-a-template-engine