繁体   English   中英

如何使用 jq 将 bash 数组添加到 JSON 数组的字段中?

[英]How to add a bash array into the fields of a JSON array using jq?

我目前有以下来自echo $items | jq JSON 输出 echo $items | jq

{
  "Family_Name": "Type 1",
  "Quantity_On_Hand": "335"
}
{
  "Family_Name": "Type 2",
  "Quantity_On_Hand": "215"
}
{
  "Family_Name": "Type 9",
  "Quantity_On_Hand": "159"
}
{
  "Family_Name": "Type 4",
  "Quantity_On_Hand": "500"
}

我也有一个相同大小的 bash 数组colors ,看起来像

"Blue" "Red" "Green" "Blue"

我怎样才能使用jq来得到类似的东西

{
  "Family_Name": "Type 1",
  "Quantity_On_Hand": "335",
  "Colors": "Blue"
}
{
  "Family_Name": "Type 2",
  "Quantity_On_Hand": "215",
  "Colors": "Red"
}
{
  "Family_Name": "Type 9",
  "Quantity_On_Hand": "159",
  "Colors": "Green"
}
{
  "Family_Name": "Type 4",
  "Quantity_On_Hand": "500",
  "Colors": "Blue"
}

我尝试使用jq --argjq -n '.{} |= [$colors]'但无法正确使用。

使用 jq 1.5 或更高版本,以及您的输入(即 JSON 对象流)和

colors=("Blue" "Red" "Green" "Blue")

以下生成所需 JSON 对象的数组:

jq -s '
  ($ARGS.positional | map({Colors: .})) as $colors
  | [., $colors] | transpose | map(add)
' --args "${colors[@]}"

如果您希望结果是 JSON 对象的流,您可以添加[]或更改transpose | map(add) transpose | map(add)transpose[] | add transpose[] | add

注意事项

(1) 即使某些颜色的名称中有空格,上述解决方案也能奏效,但通常可能需要使用其他某种机制传入数组的内容。

(2)如果你的jq不支持位置参数(--args),现在可能是升级的好时机; 如果这不是一个选项,您可以设计一个解决方法,例如,如果您的 jq 支持,则使用 --argfile 选项。

这是一个已经过 1.4 版本 jq 测试的解决方案:

jq -R -s --argfile json <(echo "$items") '
  (split("\n") | map(select(length>0))) as $colors
  | [ range(0; $colors|length) | $json[.] + {Colors: $colors[.]} ]
' <( printf "%s\n" "${colors[@]}" )

这里的微妙之处在于-argfile会将 JSON 对象流组合成一个数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM