带有输入的INDEX内置

时间:2018-11-13 08:44:18

标签: jq

我正在尝试从包含平面对象列表的json文件构建索引。

如果我使用结构

jq 'INDEX(.a + ":" + .b)' < data.json 

我得到了我想要的。但是,如果我使用

jq 'INDEX(input; .a + ":" + .b) data.json

然后我得到了错误

jq: error (at data.json:<last-line>): break

我需要使用第二种形式的原因是,然后我需要将另一个input联接到第一种形式的索引中,而我不知道如何从STDIN中进行操作。

有什么想法可以解决这个问题吗?

(当前在MacOS 10.13.6上运行jq-1.6)

添加输入(data.json):

[
    {
        "a": "a1",
        "b": "b1",
        "c": "c1",
        "d": "d1"
    },
    {
        "a": "a2",
        "b": "b2",
        "c": "c2",
        "d": "d2"
    },
    {
        "a": "a3",
        "b": "b3",
        "c": "c3",
        "d": "d3"
    }
]

预期输出

{
  "a1:b1": {
    "a": "a1",
    "b": "b1",
    "c": "c1",
    "d": "d1"
  },
  "a2:b2": {
    "a": "a2",
    "b": "b2",
    "c": "c2",
    "d": "d2"
  },
  "a3:b3": {
    "a": "a3",
    "b": "b3",
    "c": "c3",
    "d": "d3"
  }
}

2 个答案:

答案 0 :(得分:1)

INDEX/2的第一个参数应该是要索引的项目的流;在这里,.[]正是我们想要的:

INDEX(.[]; .a + ":" + .b) 

答案 1 :(得分:0)

对于jq版本1.5或更早版本,INDEX似乎不起作用(不存在?),但这可以起作用:

jq 'map({key: (.a + ":" + .b), value: .}) | from_entries' data.json