Shell - jq:将 `keys.childkeys` 的 json 列表转换为列表列表

Shell - jq: Turning json list of `keys.childkeys` into list of lists

我正在使用 jq 来解析 json file。这是 jq:

的当前输出
[
 "key1.childk2",
 "key2.childk3"
]

我想将它变成可读的 json 格式本身,如下所示:

    [ 
      ["key1","childk2"],
      ["key2","childk3"]
    ]

理想情况下,我更愿意使用 jq 来执行此操作,但是任何其他可以处理 shell 变量的 shell 工具都是公平的游戏。

使用 jq,您可以使用像 map(./".") 这样的简单过滤器 结构化地 将输入转换为您想要的 JSON 文档,但是对于所请求的 可读性,输出不会完全符合您想要的格式

如果没有任何进一步的标志,jq 将 pretty-print 输出为:

[
  [
    "key1",
    "childk2"
  ],
  [
    "key2",
    "childk3"
  ]
]

Demo

使用 --compact-output-c 标志会将整个 JSON 文档压缩成一行,而不仅仅是外部数组的元素:

[["key1","childk2"],["key2","childk3"]]

Demo

所以,如果您真的想要,您也可以自己将这些部分粘在一起,因为您希望它们在 jq 中格式化,但老实说,我不鼓励您这样做是为了绕过 jq 的内部 JSON 作曲家,你最终可能会输出无效的 JSON.

jq -r '"[", "  " + (map(./"." | tojson) | .[:-1][] += ",")[], "]"'
[
  ["key1","childk2"],
  ["key2","childk3"]
]

Demo

您可以使用 jq split 过滤器:

jq '[.[] | split(".")]'
[
  [
    "key1",
    "childk2"
  ],
  [
    "key2",
    "childk3"
  ]
]

你应该在原始 jq 命令的某处使用它

这里有一个 ruby 可以做到这一点:

ruby -r json -e 'puts JSON.parse($<.read).map{|e| e.split(".")}.to_json' file

[["key1","childk2"],["key2","childk3"]]

或者如果你想要漂亮:

ruby -r json -e 'puts JSON.pretty_generate(
            JSON.parse($<.read).map{|e| e.split(".")})
' file
[
  [
    "key1",
    "childk2"
  ],
  [
    "key2",
    "childk3"
  ]
]

或者您可以生成 精确 格式:

ruby -r json -e '
l=[]
JSON.parse($<.read).map{|e| l << e.split(".").to_s}
puts "[\n\t#{l.join(",\n\t")}\n]"
' file 
[
    ["key1", "childk2"],
    ["key2", "childk3"]
]