如何将txt转换为json?

mor*_*s__ 1 linux bash json jq

我尝试使用 jq\nconvert 成功,但没有得到我想要的结果。我试图得到我想要的结果,但这很难。

\n
jq -Rs '[ split("\\n")[] | select(length > 0) | split(" ") |  {group:.[0], instnace: .[1], value: .[2]} ]' input.txt\n
Run Code Online (Sandbox Code Playgroud)\n

原始txt文件..\n共有从cpu20到46的IP地址和值\xe2\x80\x8b\xe2\x80\x8b

\n
cpu20 10.0.20.1 12\ncpu20 10.0.20.1 22\ncpu20 10.0.20.1 13\ncpu20 10.0.20.1 11\ncpu20 10.0.20.1 14\n
Run Code Online (Sandbox Code Playgroud)\n

....~cpu46

\n

这是我尝试的结果。\n输出json

\n
{\n    "group": "cpu-46",\n    "instnace": "10.0.46.94",\n    "value": "10"\n  },\n  {\n    "group": "cpu-46",\n    "instnace": "10.0.46.95",\n    "value": "10"\n  },\n  {\n    "group": "cpu-46",\n    "instnace": "10.0.46.96",\n    "value": "11"\n  },\n  {\n    "group": "cpu-46",\n    "instnace": "10.0.46.97",\n    "value": "8"\n  },\n  {\n    "group": "cpu-46",\n    "instnace": "10.0.46.98",\n    "value": "11"\n  },\n  {\n    "group": "cpu-46",\n    "instnace": "10.0.46.99",\n    "value": "11"\n  },\n  {\n    "group": "cpu-46",\n    "instnace": "10.0.46.100",\n    "value": "8"\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

我应该怎么做才能得到如下结果?

\n
    {\n  "CPU20": [\n    { "instance": "10.0.20.1", "value": 12 },\n    { "instance": "10.0.20.2", "value": 22 },\n    { "instance": "10.0.20.3", "value": 13 },\n    { "instance": "10.0.20.4", "value": 11 },\n    { "instance": "10.0.20.5", "value": 14 }\n  ],\n  "CPU21": [\n    { "instance": "10.0.21.1", "value": 15 },\n    { "instance": "10.0.21.2", "value": 24 },\n    { "instance": "10.0.21.3", "value": 21 },\n    { "instance": "10.0.21.4", "value": 15 },\n    { "instance": "10.0.21.5", "value": 16 }\n  ],\n  "CPU22": [\n    { "instance": "10.0.22.1", "value": 12 },\n    { "instance": "10.0.22.2", "value": 18 },\n    { "instance": "10.0.22.3", "value": 19 },\n    { "instance": "10.0.22.4", "value": 12 },\n    { "instance": "10.0.22.5", "value": 13 }\n  ],\n  "CPU23": [\n    { "instance": "10.0.20.1", "value": 17 },\n    { "instance": "10.0.20.2", "value": 15 },\n    { "instance": "10.0.20.3", "value": 21 },\n    { "instance": "10.0.20.4", "value": 22 },\n    { "instance": "10.0.20.5", "value": 25 }\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

pmf*_*pmf 5

使用group_bymap

jq -Rn '
  [inputs | select(. != "") / " "]
  | group_by(.[0])
  | map({(.[0][0]): map({instance: .[1], value: .[2]})})
  | add
'
Run Code Online (Sandbox Code Playgroud)

演示

使用reduce

jq -Rn '
  reduce (inputs | select(. != "") / " ") as [$cpu, $instance, $value] ({};
    .[$cpu] += [{$instance, $value}]
  )
'
Run Code Online (Sandbox Code Playgroud)

演示由@JeffMercado
改进