jq 如何从文件中读取行并创建有效的 JSON?

问题描述 投票:0回答:2

我需要帮助通过 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 读取文件不正确。 请帮助我。

json linux bash jq
2个回答
1
投票

为什么不使用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"
    }
  ]
}

0
投票

使用双 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"
    }
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.