我需要帮助通过 jq 创建有效的 JSON 文件,该文件从文件中读取行。
我有一些text.txt文件:
rabbit1-test1
rabbit1-test2
rabbit1-test3
还有 bash 脚本:
VHOSTNAME=/
NODENAME=node1
input="test.txt"
while IFS= read -r line; do jq -n \
--arg a "$VHOSTNAME" \
--arg b "$line" \
--arg c "$NODENAME" \
'{"data": [{"{#VHOSTNAME}": $a, "{#QUEUENAME}": $b, "{#NODENAME}": $c}]}' ;done < "$input"
但是,当我运行脚本时,JSON 无效:
{
"data": [
{
"{#VHOSTNAME}": "/",
"{#QUEUENAME}": "rabbit1-test1",
"{#NODENAME}": "node1"
}
]
}
{
"data": [
{
"{#VHOSTNAME}": "/",
"{#QUEUENAME}": "rabbit1-test2",
"{#NODENAME}": "node1"
}
]
}
{
"data": [
{
"{#VHOSTNAME}": "/",
"{#QUEUENAME}": "rabbit1-test3",
"{#NODENAME}": "node1"
}
]
}
我不明白为什么 jq 读取文件不正确。 请帮助我。
为什么不使用jq的split呢?
jq -Rs --arg a '/' --arg c 'node1' '[ .[:-1] |
split("\n")[] |
{ "{#VHOSTNAME}" : $a ,
"{#QUEUENAME}": . ,
"{#NODENAME}": $c } ] |
{ "data" : . }' sample.txt
出:
{
"data": [
{
"{#VHOSTNAME}": "/",
"{#QUEUENAME}": "rabbit1-test1",
"{#NODENAME}": "node1"
},
{
"{#VHOSTNAME}": "/",
"{#QUEUENAME}": "rabbit1-test2",
"{#NODENAME}": "node1"
},
{
"{#VHOSTNAME}": "/",
"{#QUEUENAME}": "rabbit1-test3",
"{#NODENAME}": "node1"
}
]
}
使用双 jq:第一个带有
-R/--raw-input
,然后另一个带有 -s/--slurp
,如下所示:
$ echo -e "rabbit1-test1\nrabbit1-test2\nrabbit1-test3" | jq -R . | jq -s --arg a1 foo --arg a2 bar '[.[] | {x: $a1, y: ., z: $a2} ] | {data: .}'
{
"data": [
{
"x": "foo",
"y": "rabbit1-test1",
"z": "bar"
},
{
"x": "foo",
"y": "rabbit1-test2",
"z": "bar"
},
{
"x": "foo",
"y": "rabbit1-test3",
"z": "bar"
}
]
}