【发布时间】:2021-05-23 13:00:39
【问题描述】:
我有这个小型地理位置数据集。
37.9636140,23.7261360
37.9440840,23.7001760
37.9637190,23.7258230
37.9901450,23.7298770
来自随机位置。
比如这个37.97570, 23.66721
我需要使用 awk 创建一个 bash 命令,该命令以简单的欧几里得距离返回距离。
这是我使用的命令
awk -v OFMT=%.17g -F',' -v long=37.97570 -v lat=23.66721 '{for (i=1;i<=NR;i++) distances[i]=sqrt(($1 - long)^2 + ($2 - lat)^2 ); a[i]=$1; b[i]=$2} END {for (i in distances) print distances[i], a[i], b[i]}' filename
当我运行这个命令时,我得到了这个不正确的奇怪结果,有人可以向我解释我做错了什么吗?
➜ awk -v OFMT=%.17g -F',' -v long=37.97570 -v lat=23.66721 '{for (i=1;i<=NR;i++) distances[i]=sqrt(($1 - long)^2 + ($2 - lat)^2 ); a[i]=$1; b[i]=$2} END {for (i in distances) print distances[i], a[i], b[i]}' filename
44,746962127881936 37.9440840 23.7001760
44,746962127881936 37.9901450 23.7298770
44,746962127881936 37.9636140 23.7261360
44,746962127881936
44,746962127881936 37.9637190 23.7258230
已更新。
附加了@jas 提供的命令,我将od -c 包含为@mark-fuso suggetsted。
现在的问题是我从@jas 得到不同的结果
展示新问题的命令输出。
awk -v OFMT=%.17g -F, -v long=37.97570 -v lat=23.66721 '
{distance=sqrt(($1 - long)^2 + ($2 - lat)^2 ); print distance, $1, $2}
' file
1,1820150904705098 37.9636140 23.7261360
1,1820150904705098 37.9440840 23.7001760
1,1820150904705098 37.9637190 23.7258230
1,1820150904705098 37.9901450 23.7298770
od -c显示输入文件的内容。
od -c file
0000000 3 7 . 9 6 3 6 1 4 0 , 2 3 . 7 2
0000020 6 1 3 6 0 \n 3 7 . 9 4 4 0 8 4 0
0000040 , 2 3 . 7 0 0 1 7 6 0 \n 3 7 . 9
0000060 6 3 7 1 9 0 , 2 3 . 7 2 5 8 2 3
0000100 0 \n 3 7 . 9 9 0 1 4 5 0 , 2 3 .
0000120 7 2 9 8 7 7 0 \n
0000130
【问题讨论】:
-
将
for (i=1;i<=NR;i++)替换为i=NR; -
@M.NejatAydin 问题与我已回复答案的评论部分相同。
-
我得到了与答案中相同的输出。我无法重现你得到的输出。
-
语言环境设置可能有问题吗?我看到你打印距离时得到的是逗号而不是小数点。
-
我建议的唯一编辑是对 input 文件运行
od -c...不需要od -c对来自awk的输出运行重点是看看awk的内容是什么;而且由于我无权访问您的特定输入文件...您需要进行编辑...您的电话
标签: arrays linux for-loop awk settings