Bash jq:生成JSON:动态密钥创建是否可行?

Bash jq:生成JSON:动态密钥创建是否可行?,bash,variables,jq,Bash,Variables,Jq,我从未使用jq生成JSON,只是解析。所以这对我来说是一片未经旅行的土地 我发现,这让我更接近我所追求的。然而,我还没有决定如何为我正在寻找的结构动态创建键名 我正在寻找的结构如下所示: { "eth0": { "key1": "value1", "key2": "value2", "key3": "value3" }, "eth3": { "k

我从未使用jq生成JSON,只是解析。所以这对我来说是一片未经旅行的土地

我发现,这让我更接近我所追求的。然而,我还没有决定如何为我正在寻找的结构动态创建键名

我正在寻找的结构如下所示:

{
  "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,但那是我的责任。非常感谢你的回答。另一个可能的答案(在我的编辑中)也在正确的方向上,然而,我正在使用这个答案,因为它更简洁并且适用于我的用例。