1

我将以下 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 断言(真/假)排序顺序,同时考虑多个字段?

4

2 回答 2

4

这是一个相当有效的解决方案,以一种希望使其易于理解和适应的方式呈现:

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

调味。

于 2018-12-26T21:30:39.307 回答
2

任何需要使用 -s 命令行选项的解决方案都有一个缺点,即需要比实际需要更多的内存。同样sort,通常不建议使用类似的方法,但是如果想要一个简洁明了的解决方案,可以使用:

jq -s 'map([.memberId, .memberCity, .lastTransaction]) | . == sort' 

甚至在给定的特定情况下:

jq -s 'map(.[]) | . == sort' 
于 2018-12-27T09:26:57.887 回答