jq使用对象的主值过滤子数组值

问题描述 投票:0回答:3

我有一个问题,弄清楚我需要在jq中使用哪些过滤器和方法将我的json数据转换为我正在寻找的东西。我尝试的每一个组合最终要么根本不工作,要么为每个对象的每个子历法迭代每个值。

我在这方面花了太长时间,并没有取得任何进展。需要有人再戴上一双眼睛。我确信它比我正在做的更简单,但我无法弄明白!

这是我正在使用的json数据:

[
    {
        "location": "locationa",
        "services": [
            {
                "name": "serviceA",
                "version": "5.2.0.2",
                "updatedAt": "2018-04-17"
            },
            {
                "name": "serviceB",
                "version": "4.19.0.5",
                "updatedAt": "2018-04-17"
            }
        ]
    },
    {
        "location": "locationb",
        "services": [
            {
                "name": "serviceA",
                "version": "5.2.0.2",
                "updatedAt": "2018-04-17"
            },
            {
                "name": "serviceB",
                "version": "4.19.0.5",
                "updatedAt": "2018-04-17"
            },
            {
                "name": "serviceC",
                "version": "1.0.0.1",
                "updatedAt": "2018-04-17"
            }
        ]
    }
]

这是我试图摆脱的格式:

locationa serviceA 5.2.0.2
locationa serviceB 4.19.0.5
locationb serviceA 5.2.0.2
locationb serviceB 4.19.0.5
locationb serviceC 1.0.0.1
json jq
3个回答
1
投票

你可以使用+运算符连接字符串:

jq -r '.[]|.location+" "+(.services[]|.name+" "+.version)' file
locationa serviceA 5.2.0.2
locationa serviceB 4.19.0.5
locationb serviceA 5.2.0.2
locationb serviceB 4.19.0.5
locationb serviceC 1.0.0.1

1
投票

通常在尝试输出csv / tsv时,您需要生成要输出的行数组,然后传递给@csv@tsv或使用join/1以您选择的格式输出。

jq -r '.[] | [.location] + (.services[] | [.name, .version]) | @tsv' input.json

0
投票

作为替代方案,您可以考虑使用基于步行路径的unix实用程序jtc

bash $ <file.json jtc -x'<name>l:' -y'[-3][location]' -y' ' -y'[-1][version]' | xargs -L3
locationa serviceA 5.2.0.2
locationa serviceB 4.19.0.5
locationb serviceA 5.2.0.2
locationb serviceB 4.19.0.5
locationb serviceC 1.0.0.1
bash $ 
© www.soinside.com 2019 - 2024. All rights reserved.