串行数据流上的实时数学运算

Live math on serial data stream

我有一个硬件 GPS 可以打印出一些数据:

sudo cat /dev/ttyGPS_Device | grep -a GPRMC

它每半秒左右打印一次,看起来像这样:

$GPRMC,171450.000,A,4239.245592,N,07349.887355,W,0.000,116.6,150420,,,A*74
$GPRMC,171503.000,A,4239.245592,N,07349.887355,W,0.000,116.6,150420,,,A*73
$GPRMC,171504.000,A,4239.245592,N,07349.887355,W,0.000,116.6,150420,,,A*74

我可以通过以下操作过滤掉纬度和经度:

sudo cat /dev/ttyACM2 | stdbuf -oL grep -a GPRMC | stdbuf -oL cut -d',' -f 4-7 | tr ',' '\t'

而且输出看起来更好:

4239.245592 N 07349.887355 W
4239.245592 N 07349.887355 W
4239.245592 N 07349.887355 W

我希望能够对数据进行一些数学计算和格式化。具体来说,前导零需要变成“-”,并且两个值都必须乘以 100。 期望的输出:

42.39245592 N -73.49887355 W
42.39245592 N -73.49887355 W
42.39245592 N -73.49887355 W

我可以接受非 bash 解决方案,但我更喜欢漂亮的单衬垫。我用来获取 GPS 数据的硬件是 Ericsson H5321 gw Mobile Broadband Module

追加 GNU awk:

| awk '{printf("%.8f %s -%.8f %s\n",/100,,/100,)}'

输出:

42.39245592 N -73.49887355 W
42.39245592 N -73.49887355 W
42.39245592 N -73.49887355 W

一行shell:

xargs -I"{}" -l1 sh -c 'IFS=,;set -- ;LC_NUMERIC=C;printf "%f N %f W\n" "" ""' {}

显然 ,shell 算术只处理整数,所以没有值的缩放。