为jq数组中的每个项运行一个命令

时间:2017-12-05 18:06:46

标签: bash jq

这是我输入文件的样子:

[
  {
    "ConfigType": "ABC",
    "Prop1": 3,
    "Prop2": 30
  },
  {
    "ConfigType": "XYZ",
    "Prop3": "Hello",
    "Prop4": "World",
    "Prop5": "Application"
  }
]

我需要为每个项目准备插入语句。

这是我的jq命令的样子,它给了我每个项目。

cat app-cnfg.json |  jq -r ".[]"

如何执行aws dynamodb put-item --table-name "xxx" --item <<array's element>>

2 个答案:

答案 0 :(得分:5)

您可以应用过滤器来提取JSON数组的每个元素,并将其提供给bash中的数组并稍后迭代其内容。假设您有bash 4.0或更高版本,则可以使用mapfile命令作为

mapfile -t configArr < <(jq -c '.[]'  < app-cnfg.json)

现在我们遍历数组,为每个配置项运行命令,

for config in "${configArr[@]}"; do
    aws dynamodb put-item --table-name "xxx" --item "$config"
done

(或)使用更有效的方式使用while循环和read命令从输入数据流中读取(适用于不支持bash版本的mapfile版本readarraywhile IFS= read -r config; do aws dynamodb put-item --table-name "xxx" --item "$config" done< <(jq -c '.[]' < app-cnfg.json)

<dependency>
    <groupId>net.sf.barcode4j</groupId>
    <artifactId>barcode4j</artifactId>
    <version>2.1</version>
</dependency>

答案 1 :(得分:5)

您可以输入xargs

jq -c '.[]' app-cnfg.json \
    | xargs -L 1 aws dynamodb put-item --table-name "xxx" --item

jq的-c选项确保每个元素都在一行上,而-L 1 xargs选项确保每个项目都调用一次命令。

如果你想避免跟踪空格的潜在问题(这会使args将后续行视为当前行的延续),你可以将对象零字节分开:

jq -j '.[] | tostring + "\u0000"' app-cnfg.json \
    | xargs -0 -n1 aws dynamodb put-item --table-name "xxx" --item

-j选项会抑制来自jq的换行符,tostring会对对象进行字符串化,+ "\u0000"会附加一个零字节。

xargs -0 -n1期望零字节分隔输入,并为每个参数运行一次命令。