基本上我只是想按照他们各自的种子排列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无济于事。我没有想法。
答案 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"]