Чтобы получить все имена пользователей, т. е. всю строку, связанную с ключом login
, из правильно сформированного документа JSON , не зная структуры документа:
jq -r '..|select(.login?).login' file.json
Применение этого к нескольким файлам JSON, а также сортировка и подсчет результата:
jq -r '..|select(.login?).login' *.json | sort | uniq -c
Здесь используется выражение jq
..
:Повторный просмотр всех ключей и значений. select(.login?)
:Выберите обнаруженные объекты, содержащие ключ login
. .login
:Получите значение для этого ключа. Словарь, который вы хотели бы иметь, основанный на приведенном выше jq
выражении:
jq -sr '[..|select(.login?).login]|group_by(.)|map({key:.[0],value:length})|from_entries' *.json
Тестирование:
$ cat file.json
{"this":"is", "A":{"login":"username2"}, "type":{"of":"object", "but":"please"},
"go":"withit", "login":"me"}
$ jq -sr '[..|select(.login?).login]|group_by(.)|map({key:.[0],value:length})|from_entries' file.json
{
"me": 1,
"username2": 1
}
Дважды передать один и тот же файл:
$ jq -sr '[..|select(.login?).login]|group_by(.)|map({key:.[0],value:length})|from_entries' file.json f
ile.json
{
"me": 2,
"username2": 2
}
Используйте jq
с -c
для получения однострочного компактного вывода.
Для нашего примера файла jq -sr '[..|select(.login?).login]' file.json
даст
[
"me",
"username2"
]
Прохождение через group_by(.)
дает
[
[
"me"
],
[
"username2"
]
]
Часть map({key:.[0],value:length})
дает
[
{
"key": "me",
"value": 1
},
{
"key": "username2",
"value": 1
}
]
и from_entries
в конце дают окончательный результат.