【问题标题】:Run a command for each item in jq array为 jq 数组中的每个项目运行一个命令
【发布时间】:2017-12-05 18:06:45
【问题描述】:

这是我的输入文件的样子:

[
  {
    "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>>

【问题讨论】:

    标签: bash jq


    【解决方案1】:

    您可以通过管道发送到xargs

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

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

    如果您想避免尾随空格的潜在问题(这将使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 需要零字节分隔的输入,并为每个参数运行一次命令。

    【讨论】:

    • -L 是一个有趣的选择——当然,jq 不应该发出以空格结尾的行(当不在原始字符串模式时),但如果它确实 i>,据我所知,这将被视为延续。
    • @CharlesDuffy 是的,正在检查我是否可以从 jq 获得 nul 字节分隔的输出...
    • 你可以;这有点棘手。请参阅github.com/stedolan/jq/issues/1271 进行讨论——-j 禁止换行,因此您可以通过表达式添加 NUL。 jq -j '.[] | (. + "\u0000")',总结(如果适当谨慎,可能会将它们从数据中过滤掉)。
    • @CharlesDuffy 已更新。
    • @BenjaminW。如果我想在同一个项目上执行多个命令,例如echo 然后aws dynamodb put-item --table-name "xxx" --item,我该怎么做?
    【解决方案2】:

    您可以应用过滤器来提取 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 命令使用更有效的方式从输入数据流中读取数据(适用于不支持mapfilereadarraybash 版本)

    while IFS= read -r config; do
        aws dynamodb put-item --table-name "xxx" --item "$config"
    done< <(jq -c '.[]' < app-cnfg.json)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-28
      • 2018-12-04
      • 2022-08-07
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多