使用jq

时间:2019-01-10 13:11:45

标签: json jq

我的数据是带有许多键的对象列表。要浏览数据,我只想查看一组受限的键。

input:
[
    {
        "field_1":123,
        "field_2":123,
        "field_3":123,
        "field_4":123,
        "field_5":123,
        ...and so on...
    },
    {
        "field_1":123,
        "field_2":123,
        "field_3":123,
        "field_4":123,
        "field_5":123,
        ...and so on...
    },
    ...many objects like this...
]
我想要这样的结果:
[
    {
        "field_1":123,
        "field_2":123,
    },
    {
        "field_1":123,
        "field_2":123,
    },
    ...all objects like this...
]

我知道我可以做到:

jq '.[] | {field_1:.field_1,field_2:.field_2}'

但是对于命令行上的数据探索它变得重复。是否有可用的快捷功能,例如:

jq '.[] | filter_keys("field_1","field_2")'

2 个答案:

答案 0 :(得分:2)

有一个简写形式:

jq '.[] | {field_1,field_2}'

答案 1 :(得分:1)

根据您的情况,您可能只想包含对象中存在的字段,因此必须进行一些路径过滤。然后,您可以只传递要包括的字段列表。甚至进行基于模式的过滤。

$ jq --arg fields 'field_1,field_2' '
map(with_entries(select(. as {$key} | any($fields|split(",")[]; $key == .))))
' input.json

与任何过滤器一样,它们可以被制成函数并保存到~/.jq文件中,以便通过以下方式在全球范围内使用:

def filter_keys($keys):
    with_entries(select(. as {$key} | any($keys[]; $key == .)));

并使用它:

$ jq --arg fields 'field_1,field_2' 'map(filter_keys($fields|split(",")))'