[英]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 --arg
或jq -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.