jq - 按相关值排序值

时间:2017-04-08 21:53:24

标签: json sorting jq

基本上我只是想按照他们各自的种子排列NCAA March Madness队列表。

我正在使用http://data.ncaa.com/jsonp/scoreboard/basketball-men/d1/2017/03/17/scoreboard.html中的JSON文件。它实际上是JSONP,但我在使用以下方法解析之前将其转换为JSON:

jq -s -R  '.[1+index("("): rindex(")")] | fromjson'

将其输入以下命令我可以生成一个很好的团队列表:

jq -r '.scoreboard[].games[] | select(.bracketRound=="First Round" and .bracketRegion=="EAST") | .home,.away | .nameRaw'

......但我希望他们按照他们的种子顺序。我尝试过以各种方式使用sort和sort_by无济于事。我没有想法。

2 个答案:

答案 0 :(得分:0)

这样做你想要的吗?

jq -r '
def NameAndSeed(f): f | {nameRaw, "teamSeed" : (.teamSeed | tonumber)};
[ 
  .scoreboard[].games[]
  | select(.bracketRound=="First Round" and .bracketRegion=="EAST")
  | NameAndSeed(.home), NameAndSeed(.away)
]
| sort_by(.teamSeed) 
| .[].nameRaw'

为了让sort_by做我想你想做的事,我将对象放在一个数组中,并将teamSeed值转换为数字。

答案 1 :(得分:0)

根据您的数据,以下过滤器:

[ .scoreboard[].games[]
  | select(.bracketRound=="First Round" and .bracketRegion=="EAST")
  | (.home, .away) ]
| sort_by(.teamSeed | tonumber) 
| .[]
| [.teamSeed, .nameRaw ]

产生

["2","Duke"]
["3","Baylor"]
["6","SMU"]
["7","South Carolina"]
["10","Marquette"]
["11","USC"]
["14","New Mexico St."]
["15","Troy"]

如果您只想要“nameRaw”值,请将过滤器的最后一行替换为:| .nameRaw

请注意,此处需要tonumber,因为种子值以字符串形式给出。

处理多个顶级对象

在评论中,OP给出了一个pastebin(https://pastebin.com/1eTAX4y3),它由两个顶级对象组成,每个对象都有一个“记分板”。因此,让我们考虑任意数量的此类对象的情况。

为清楚起见,我们首先定义一个函数,用JSON对象选择带有“记分板”的home / away对象:

def games:
  [.scoreboard[].games[]
   | select(.bracketRound=="First Round" and .bracketRegion=="EAST")
   | (.home, .away) ] ;

使用-s命令行选项,我们可以确保JSON输入是一个对象数组。 games生成的数组可以使用add组合:

map(games)
| add
| sort_by(.teamSeed | tonumber) 
| .[]
| [.teamSeed, .nameRaw ]

给定pastebin数据,使用命令行选项-s和-c选项进行调用会产生:

["1","Villanova"]
["2","Duke"]
["3","Baylor"]
["4","Florida"]
["5","Virginia"]
["6","SMU"]
["7","South Carolina"]
["8","Wisconsin"]
["9","Virginia Tech"]
["10","Marquette"]
["11","USC"]
["12","UNCW"]
["13","East Tenn. St."]
["14","New Mexico St."]
["15","Troy"]
["16","Mt. St. Mary's"]