【问题标题】:How can jq read lines from a file and create valid a JSON?jq 如何从文件中读取行并创建有效的 JSON?
【发布时间】:2020-02-18 13:26:10
【问题描述】:

我需要帮助来通过 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 片段;你的意思是你想要它们之间的逗号?
  • 这看起来确实像真正有效的 JSONS,因为您多次运行 jq 并获得了几个有效的 JSON。
  • 有效的 json 是 { "data": [ { "{#VHOSTNAME}": "/", "{#QUEUENAME}": "rabbit1-test1", "{#NODENAME}": "node1" }, { "{#VHOSTNAME}": "/", "{#QUEUENAME}": "rabbit1-test2", "{#NODENAME}": "node1" } ] }
  • 如何为我的文件中的所有行创建一个 JSON?

标签: json linux bash jq


【解决方案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"
    }
  ]
}

【讨论】:

  • 但是,当我不是从文件中运行 jq 而是使用“while”时,它不起作用。
  • @perrfect 为什么需要一段时间?
  • 因为我需要 rabbitMQ 队列的脚本。我想获取命令 jq,所有队列,通过命令 - “rabbitmqctl list_queues”,不使用 .txt 文件。
  • 仍然不需要一段时间。 rabbitmqctl list_queues | jq -Rs --arg a '/' --arg c 'node1' ....
  • 抱歉,我需要使用“阅读行”。在 rabbitMQ 我有 1000 个队列,我必须读取 100 个队列块
猜你喜欢
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2023-03-26
  • 2022-08-14
  • 2018-01-10
  • 2014-11-11
相关资源
最近更新 更多