2017-10-05 29 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