2017-10-05 73 views
1

我试图使用jq命令bash脚本中的如何使用jq获取经度和纬度而不会丢失尾随零?

#!/bin/bash 

timeout -t 15 gpspipe -w -n 8 gpsd | jq '{latitude:.lat,longitude:.lon}' | 
{ 
    # do something 
} 

所以从gpspipe

{ 
    "lat":34.284606710, 
    "lon":-12.543774500 
} 

如果我用JQ我的投入,得到纬度和经度值的结果将是:"34.28460671"纬度为"-12.5437745"为经度。

我想什么是获取值作为字符串(与尾随零),即"34.284606710""12.543774500"

所以基本上,我的问题是,我不能得到纬度和经度作为字符串(与后零),在bash脚本中使用jq

+0

为什么你要吗? –

+0

我需要这些坐标来将设备的位置设置为当前位置。没有尾随零点的位置将是错误的。 – am1991

+0

对不起,我还是没有得到你..一个简单的'object.lat.toString()'将会得到值作为字符串,不是吗? –

回答

1

如何使用jq获取经纬度而不丢失尾部零点 ? 块引用

更改您的JSON响应值到字符串

{"lat":34.284606710,"lon":-12.543774500} 

{"lat":"34.284606710","lon":"-12.543774500"}

解析与

字符串纬度= object.lat.toString() ;

String longitude = object.lon.toString();

通过这种方式,您永远不会失去任何来自您的JSON响应的东西。

+0

无论你使用什么,如果你非常了解JSON并将字符串/文本定义为一个值,它可以帮助你解决你的问题,即“21.1210000”或“3434343403040” – 2017-10-05 10:03:04

1

bash脚本中,您可以使用带有字符串插值的jq来获取纬度和经度值,并使用printf()进行零填充。 jq中的-r标志将从这些值中除去双引号并将它们送入while循环。

timeout -t 15 gpspipe -w -n 8 gpsd | jq -r '"\(.lat) \(.lon)"' | while read -r lat lon; do 
    printf -v z_lat "%.9f" "$lat" 
    printf -v z_lon "%.9f" "$lon" 
    printf "Padded lat: %s Padded lon: %s\n" "${z_lat}" "${z_lon}"  
done 

printf -v确实需要的格式从jq并施加所需的尾随零填充,并存储在变量z_latz_lon接收的变量。

2

下面是一个使用pad功能的解决方案:

def pad(n):"\(.)"|(split(".")+["0"])[:2]|.[1]|=(.+"0"*n)[:n]| join("."); 
"\(.lat|pad(9)) \(.lon|pad(9))" 

def pad(n): 
    "\(.)"     # convert to string 
    | (split(".")+["0"])[:2] # split into whole and fractional parts 
    | .[1]|=(.+"0"*n)[:n]  # keep first n digits after adding n zeros to fraction 
    | join(".")    # combine back into a string 
    ; 

你可以看到它是如何工作的https://jqplay.org/s/e8ZHP1t_K3

与样品数据data.json和上述过滤器在filter.jq的命令中

$ jq -r -f filter.jq data.json 

产生

34.284606710 -12.543774500