Проверьте порядок сортировки полей JSON
У меня есть следующие записи JSON, хранящиеся в контейнере
{"memberId":123,"memberCity":"Chicago","lastTransaction":1504155600000}
{"memberId":123,"memberCity":"Chigago","lastTransaction":150175600000}
{"memberId":123,"memberCity":"New York","lastTransaction":150195600000}
Я ищу, чтобы проверить, что порядок сортировки, в которой хранятся эти записи, отсортированы по memberId ASC, memberCity ASC, lastTransaction ASC
Есть ли способ через jq, чтобы я мог утверждать (true/false) порядок сортировки, принимая во внимание несколько полей?
2 ответа
Любое решение, которое требует использования параметра командной строки -s, имеет недостаток, заключающийся в том, что он требует больше памяти, чем необходимо. Аналогично используя sort
в общем случае нецелесообразно, но если кто-то хочет получить краткое и простое решение, можно использовать:
jq -s 'map([.memberId, .memberCity, .lastTransaction]) | . == sort'
или даже в конкретном случае дано:
jq -s 'map(.[]) | . == sort'
Вот довольно эффективное решение, представленное таким образом, который, как мы надеемся, облегчает его понимание и адаптацию:
def sorted:
if length <= 1 then true
else map([.memberId, .memberCity, .lastTransaction])
| .[0] <= .[1]
end;
def pairs(stream):
foreach stream as $i ([];
.[-1:] + [$i];
select(length==2));
all(pairs(inputs); sorted)
Призвание:
jq -n -f sorted.jq input.json
Если звезды выровнены правильно, и вы хотите одну строку:
jq 'all(foreach [inputs[]] as $i ([[.[]]]; [.[-1],$i]); .[0]<=.[1])' input.json
Сезон по вкусу.