微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用jq计数使用的卫星数并从gpsd输出中查看

如何解决使用jq计数使用的卫星数并从gpsd输出中查看

考虑此JSON:

{"class":"POLL","time":"2020-08-24T07:01:31.690Z","active":1,"tpv":[{"class":"TPV","tag":"ID8fac","device":"/dev/ttyM1","mode":3,"time":"2020-08-24T07:01:31.000Z","ept":0.005,"lat":-37.043028622,"lon":145.984996786,"alt":708.492,"epx":9.963,"epy":14.642,"epv":0.000,"speed":0.000,"climb":0.000,"eps":29.28}],"gst":[{"class":"GST","time":"1970-01-01T00:00:00.000Z","rms":0.000,"major":0.000,"minor":0.000,"orient":0.000,"lat":0.000,"lon":0.000,"alt":0.000}],"sky":[{"class":"SKY","xdop":0.66,"ydop":0.98,"vdop":0.00,"tdop":1.00,"hdop":0.00,"gdop":1.00,"pdop":0.00,"satellites":[{"PRN":17,"el":42,"az":137,"ss":43,"used":true},{"PRN":12,"el":27,"az":241,"ss":44,{"PRN":24,"el":53,"az":247,"ss":46,{"PRN":6,"el":55,"az":54,"ss":36,{"PRN":15,"el":10,"az":307,"ss":40,{"PRN":2,"el":31,"az":358,"ss":37,{"PRN":28,"el":20,"az":89,"ss":35,{"PRN":7,"az":52,"ss":31,"used":false},{"PRN":19,"el":64,"az":148,"ss":45,{"PRN":13,"az":338,"ss":29,"el":18,"az":297,"ss":33,{"PRN":22,"az":17,"ss":39,"used":false}]}]}

我对解析上面的JSON中的Satellites数组感兴趣(返回以下内容),并返回两个数字:Satellite的数量和使用的Satellite的数量。例如:7 12

[
  {
    "PRN": 17,"el": 42,"az": 137,"ss": 43,"used": true
  },{
    "PRN": 12,"el": 27,"az": 241,"ss": 44,{
    "PRN": 24,"el": 53,"az": 247,"ss": 46,{
    "PRN": 6,"el": 55,"az": 54,"ss": 36,{
    "PRN": 15,"el": 10,"az": 307,"ss": 40,{
    "PRN": 2,"el": 31,"az": 358,"ss": 37,{
    "PRN": 28,"el": 20,"az": 89,"ss": 35,{
    "PRN": 7,"az": 52,"ss": 31,"used": false
  },{
    "PRN": 19,"el": 64,"az": 148,"ss": 45,{
    "PRN": 13,"az": 338,"ss": 29,"el": 18,"az": 297,"ss": 33,{
    "PRN": 22,"az": 17,"ss": 39,"used": false
  }
]

目前,我只能弄清楚如何一次性解析一个值;这就是我所拥有的:

jq -r '[ .sky[] | .satellites[]| select(.used == true )| "\( .PRN )" ] |length'

输出使用的卫星数,例如7。

为了完整起见,在偶然的情况下它可能会帮助某人,我以bash方式轮询gpsd,如下所示。这将返回一个JSON结构,如本文开头所示:

timeout 1 grep -m1 satellites < <(printf '%s\n' '?WATCH={"enable":true,"json":true};?POLL;' | nc 127.0.0.1 2947) 

解决方法

对于显示的输入:

$ jq -r '.sky[].satellites | ( [ .[] | select(.used == true) ] | length ),length'
9
12

或者(但是您也可以将其通过管道传输到paste -sd" "):

$ jq -r '.sky[].satellites | ( [ .[] | select(.used == true) ] | length | tostring) + " " + (length|tostring)'
9 12

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。