我试图从一堆通过--arg参数传递给jq的值生成JSON文件。生成的格式是正确的,但内容是意外的:
$ jq --arg value_a0 1.1.1.1 --arg value_b0 81 --arg value_a1 2.2.2.2 --arg value_b1 82 --arg value_a2 3.3.3.3 --arg value_b2 83 '. | .nodes=[ .ip=$value_a0 | .port=$value_b0, .ip=$value_a1 | .port=$value_b1, .ip=$value_a2 | .port=$value_b2 ]' <<<'{}'
{
"nodes": [
{
"ip": "1.1.1.1",
"port": "83"
},
{
"ip": "3.3.3.3",
"port": "83"
},
{
"ip": "2.2.2.2",
"port": "83"
},
{
"ip": "3.3.3.3",
"port": "83"
}
]
}
我希望得到:
{
"nodes": [
{
"ip": "1.1.1.1",
"port": "81"
},
{
"ip": "2.2.2.2",
"port": "82"
},
{
"ip": "3.3.3.3",
"port": "83"
}
]
}
我希望.nodes = []只是总结用逗号分隔的操作结果,但我显然遗漏了一些东西。 :(
答案 0 :(得分:2)
以您的尝试方式完成您想要的任何方式如下:
jq -n --arg value_a0 1.1.1.1 --arg value_b0 81 --arg value_a1 2.2.2.2 --arg value_b1 82 --arg value_a2 3.3.3.3 --arg value_b2 83 '
.nodes=[ {ip: $value_a0, port: $value_b0},
{ip: $value_a1, port: $value_b1},
{ip: $value_a2, port: $value_b2} ]'
请注意,可以使用-n代替'&lt;&lt;&lt; {}”。
使用'=',可以类似地使用过滤器:
.nodes=[ (.ip=$value_a0 |.port=$value_b0),
(.ip=$value_a1 |.port=$value_b1),
(.ip=$value_a2 |.port=$value_b2) ]
然而,以这种方式使用--arg似乎非常痛苦。可能有许多更好或更灵活的替代品。例如,考虑一下:
echo '"1.1.1.1" "81" "2.2.2.2" "82" "3.3.3.3" "83"' | jq -n '
[{ip:inputs, port:input}]
'
或者,如果您不想引用输入字符串:
cat << EOF | jq -R -n '[{ip: inputs, port: input}]'
1.1.1.1
81
2.2.2.2
82
3.3.3.3
83
EOF