Bash jq:生成JSON:动态密钥创建是否可行?
我从未使用jq生成JSON,只是解析。所以这对我来说是一片未经旅行的土地 我发现,这让我更接近我所追求的。然而,我还没有决定如何为我正在寻找的结构动态创建键名 我正在寻找的结构如下所示:Bash jq:生成JSON:动态密钥创建是否可行?,bash,variables,jq,Bash,Variables,Jq,我从未使用jq生成JSON,只是解析。所以这对我来说是一片未经旅行的土地 我发现,这让我更接近我所追求的。然而,我还没有决定如何为我正在寻找的结构动态创建键名 我正在寻找的结构如下所示: { "eth0": { "key1": "value1", "key2": "value2", "key3": "value3" }, "eth3": { "k
{
"eth0":
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"eth3":
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
}
源自csv:
iface,key1,key2,key3
eth0,value1,value2,value3
eth3,value1,value2,value3
我遇到的问题是从CSV动态生成JSON中的键。我还没有发现jq有能力做到这一点。我正在使用jq1.5
我在这上面转轮子吗
编辑-可能的答案
目前正在调查这本食谱的答案:
理想情况下,您的输入应该是JSON,这样您就可以运行文件,将CSV文件转换为包含数据的数组,以便jq可以使用它。假设您的数据不复杂,并且值本身不包含逗号,您可以读取原始行并拆分它们。那么,这只是一个建立你的结果的问题
$ jq -R 'split(",") as $k |
reduce (inputs | split(",")) as $r ({};
.[$r[0]] = ([range(1;$k|length) | { key: $k[.], value: $r[.] }] | from_entries)
)' input.csv
这是一个简单的解决方案,实际上与Jeff的非常相似(特别是,它对CSV做出了相同的假设),但第一行使用
input
,其余行使用inputs
,这是jq烹饪书中“objectify”的简化版本,在主过滤器中添加add
而不是reduce
:
jq -R -n '
def objectify(headers): . as $in
| reduce range(0; headers|length) as $i
({}; .[headers[$i]] = $in[$i] );
((input|split(","))[1:]) as $headers
| [ (inputs|split(",")) as $line
| { ($line[0]): ($line[1:] | objectify($headers)) } ]
| add
'
鉴于我的数据非常简单,我将此标记为答案。它工作得很好,虽然我需要稍微修改我的csv,但那是我的责任。非常感谢你的回答。另一个可能的答案(在我的编辑中)也在正确的方向上,然而,我正在使用这个答案,因为它更简洁并且适用于我的用例。