使用 jq 将键值行转换为 json

Using jq to transform lines of key-values to json

我希望将 key value(space 分隔)的一组行转换为 JSON。我希望为此使用 jq-1.5

local.location.altitude   3.0
local.location.latitude   40.025495
local.location.longitude  -74.312501
local.orientation.pitch   0.0
local.orientation.roll    0.0
local.orientation.yaw     0.0
local.velocity.azimuth    0.0
local.velocity.elevation  0.0
local.velocity.magnitude  0.0

{
  "local.location.altitude": "3.0",
  "local.location.latitude": "40.025495",
  "local.location.longitude": "-74.312501",
  "local.orientation.pitch": "0.0",
  "local.orientation.roll": "0.0",
  "local.orientation.yaw": "0.0",
  "local.velocity.azimuth": "0.0",
  "local.velocity.elevation": "0.0",
  "local.velocity.magnitude": "0.0"
}

我正在尝试如下命令:

./get-data | jq -R 'splits("\s+")'
./get-data | jq -R 'splits("\s+")|{ a : .[0], b : .[1] }

但是无法让它工作。我觉得我很接近。有人知道如何从 {{key}} {{val}}{"key": "value"} 吗?

将原始输入模式与空输入模式一起使用 -n,这样您就可以通过 [inputs] 获得整个输入,并通过指示一个或多个空白字符的正则表达式进一步拆分。

split() 方法可以使用第二个参数来指示要提供的任何可能的标志。

同样在对象构造中,使用(..)生成键名。

jq -nR '[inputs] | map(split("\s+"; "")) | map({(.[0]): .[1]}) | add'

如果您想要数字形式的值,而不是字符串形式,请使用 (.[1] | tonumber) 而不仅仅是 .[1]

jqplay demo

以下是一些适用于 jq 1.5 的方法:

  • 使用 capturefrom_entries
jq -Rn '[inputs | capture("(?<key>\S+)\s+(?<value>.+)")] | from_entries' 

Demo

  • 使用 splitsreduce
jq -Rn 'reduce (inputs | [splits("\s+")]) as [$k,$v] ({}; .[$k] = $v)'

Demo

  • 使用 splitsadd
jq -Rn '[inputs | [splits("\s+")] as [$k, $v] | {($k): $v}] | add'

Demo