使用awk修剪GPS信息



在一个小的bash脚本中,我只是尝试修剪GPS输入数据,以便我在单独的变量中具有经度和纬度值:

echo $geo_data
GPS_latitude=$( echo $geo_data | awk -F"+|-" '{print substr($0,index($0,$2-1),1) $2}' )
GPS_longitude=$( echo $geo_data | awk -F"+|-" '{print substr($0,index($0,$3-1),1) $3}' )
echo $GPS_latitude
echo $GPS_longitude

但是我得到的东西似乎混淆了每个组件前面的 +/- 符号:

-04.7367+055.5230
-04.7367
-055.5230

我以为 index((-参数可以完全避免这种情况,但显然我做错了什么。知道如何解决这个问题吗?

使用 bash 和正则表达式:

geo_data="-04.7367+055.5230"
[[ "$geo_data" =~ ^([+-][0-9.]+)([+-][0-9.]+)$ ]]
echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}"

输出:

-04.7367 +055.5230

您需要从index而不是字段值的输出中减去1

$ echo '-04.7367+055.5230' | awk -F"+|-" '{print substr($0,index($0,$2)-1,1) $2}' 
-04.7367
$ echo '-04.7367+055.5230' | awk -F"+|-" '{print substr($0,index($0,$3)-1,1) $3}' 
+055.5230


您还可以使用 bash 参数扩展

$ s='-04.7367+055.5230'
$ a="${s%+*}"
$ b="${s#${s%+*}}"
$ echo "$a"
-04.7367
$ echo "$b"
+055.5230
$ # or, use the value of variable 'a'
$ c="${s#$a}"
$ echo "$c"
+055.5230

您可以使用sed来提取这些值:

geo_data='-04.7367+055.5230'
GPS_latitude=$(sed 's/(.*)[-+].*/1/' <<< "$geo_data")
GPS_longitude=$(sed 's/.*([-+].*)/1/' <<< "$geo_data")
echo "GPS Latitude: ${GPS_latitude} and GPS longitude: ${GPS_longitude}"
# => GPS Latitude: -04.7367 and GPS longitude: +055.5230

观看在线演示

纬度模式是(.*)[-+].*,它将+-的所有字符捕获到第 1 组中,然后匹配其余字符。匹配项将替换为组 1 内容,因此您可以在最后一个+-之前获得所有内容。

POSIX BRE 正则表达式详细信息

  • (- 捕获组 #1 的开始(1从替换模式引用此值(
    • .*- 任意 0 个或多个字符
  • )- 捕获组结束
  • [-+]- 与-+匹配的括号表达式
  • .*- - 任意 0 个或多个字符。

GPS_longitude模式是相同的,但捕获最后一个-+之后的所有内容,包括加号或连字符。

grep解决方案:

$ geo_data=-04.7367+055.5230
$ echo $geo_data
-04.7367+055.5230
$ GPS_latitude=$(grep -o '^[+-][^+-]*' <<< $geo_data)
$ GPS_longitude=$(grep -o '[+-][^+-]*$' <<< $geo_data)
$ echo "GPS Latitude: $GPS_latitude; GPS Longitude: $GPS_longitude"
GPS Latitude: -04.7367; GPS Longitude: +055.5230

最新更新