使用 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]
以下是一些适用于 jq 1.5 的方法:
- 使用
capture
和 from_entries
jq -Rn '[inputs | capture("(?<key>\S+)\s+(?<value>.+)")] | from_entries'
- 使用
splits
和 reduce
jq -Rn 'reduce (inputs | [splits("\s+")]) as [$k,$v] ({}; .[$k] = $v)'
- 使用
splits
和 add
jq -Rn '[inputs | [splits("\s+")] as [$k, $v] | {($k): $v}] | add'
我希望将 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]
以下是一些适用于 jq 1.5 的方法:
- 使用
capture
和from_entries
jq -Rn '[inputs | capture("(?<key>\S+)\s+(?<value>.+)")] | from_entries'
- 使用
splits
和reduce
jq -Rn 'reduce (inputs | [splits("\s+")]) as [$k,$v] ({}; .[$k] = $v)'
- 使用
splits
和add
jq -Rn '[inputs | [splits("\s+")] as [$k, $v] | {($k): $v}] | add'