jq фильтрация значений подмассива с основными значениями объекта - PullRequest
0 голосов
/ 18 апреля 2019

У меня проблема с выяснением, какие фильтры и методы мне нужно использовать в 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

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

Как правило, при попытке вывести csv / tsv, вы хотите сгенерировать массивы строк для вывода, затем передать их на @csv или @tsv или использовать join/1 для вывода в выбранном формате.

jq -r '.[] | [.location] + (.services[] | [.name, .version]) | @tsv' input.json
1 голос
/ 18 апреля 2019

Вы можете объединить строки, используя оператор +:

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
0 голосов
/ 19 апреля 2019

в качестве альтернативы вы можете рассмотреть возможность использования утилиты 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 $ 
...