jq 从数组中选择具有字段最小值或最大值的记录

Art*_*nov 3 json max min jq

我有一个 json 记录如下:

[
 {"number":1},
 {"number":3}
]
Run Code Online (Sandbox Code Playgroud)

并想要选择(过滤)具有字段“number”的最大值或最小值的记录。

我可以获得“数字”的最小值或最大值,如下所示:

$ echo '[{"number":1},{"number":3}]' | jq ' [ .[].number ] | min'

(发出 1)

我可以输出布尔值:

$ echo '[{"number":1},{"number":3}]' | jq '.[].number==([ .[].number ] | min)'
true
false
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将其与 select 结合起来时,它失败了:

$ echo '[{"number":1},{"number":3}]' | jq 'map(select(.[].number==([ .[].number ] | min)))'
jq: error (at <stdin>:1): Cannot index number with string "number"
Run Code Online (Sandbox Code Playgroud)

我觉得我很接近,但被困住了。我究竟做错了什么?

提前致谢!

pea*_*eak 7

([ .[].number ] | min) as $m| map(select(.number== $m))
Run Code Online (Sandbox Code Playgroud)

请参阅https://jqplay.org/s/bUwtNrfAE-

第一的

要检索第一个最小项目:

([ .[].number ] | min) as $m| first(.[]|select(.number== $m))
Run Code Online (Sandbox Code Playgroud)

min_by、minimal_by 等

jq 具有内置函数max_by和,如https://stedolan.github.io/jq/manual/#Builtinoperatorsandfunctionsmin_by中所述

有关 的定义maximal_by,请参阅 jq 食谱https://github.com/stedolan/jq/wiki/Cookbook#find-the-maximal-elements-of-an-array-or-stream。该部分还具有面向流的定义。

  • 谢谢!事实证明 max_by 和 min_by 为我做了这件事: `echo '[{"number":1},{"number":3}]' | jq 'min_by(.number)'`,但再次感谢您展示变量的技巧! (2认同)