【问题标题】:How can I use jq to get latitude and longitude without losing trailing zeros?如何使用 jq 获取纬度和经度而不丢失尾随零?
【发布时间】:2017-10-05 08:05:44
【问题描述】:

我正在尝试在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 获取 lat 和 lon 值,结果将是:"34.28460671" 表示纬度,"-12.5437745" 表示经度。

我想要的是将值作为字符串(带有尾随零),即"34.284606710""12.543774500"

所以基本上,我的问题是我无法在 bash 脚本中使用 jq 将 lat 和 lon 作为字符串(带有尾随零)。

【问题讨论】:

  • 你为什么要那个?
  • 我需要这些坐标来将设备的位置设置为他的当前位置。如果没有尾随零,则位置将是错误的。
  • 对不起,我没听懂你.. 一个简单的object.lat.toString() 可以将值作为字符串获取,不是吗?
  • @kevinSpaceyIsKeyserSöze 对造成的混乱表示抱歉。我正在处理一个 bash 脚本,而不是 javascript。我更新了我的问题
  • 所以您的设备会要求您使用34.000000000 而不仅仅是34?哎呀。

标签: linux bash precision jq


【解决方案1】:

这是使用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

【讨论】:

    【解决方案2】:

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

    将您的 JSON 响应值更改为字符串

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

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

    解析

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

    字符串经度=object.lon.toString();

    通过这种方式,您永远不会从 JSON 响应中丢失任何东西。

    【讨论】:

    • 无论您使用什么,如果您熟悉 JSON 并将 String/Text 定义为一个值,它可以帮助您解决问题,即“21.1210000”或“34.34343403040”
    【解决方案3】:

    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 -vjq 接收到的变量执行所需的格式化,并应用所需的尾随零填充并存储在变量z_latz_lon 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多