Regex 将地理坐标转换为十进制值
我有一个csv文件,包含地理名称和地理坐标。下面是一个例子:Regex 将地理坐标转换为十进制值,regex,bash,coordinates,Regex,Bash,Coordinates,我有一个csv文件,包含地理名称和地理坐标。下面是一个例子: "Afghanistan","33 00 N","65 00 E" "Akrotiri","34 37 N","32 58 E" "Albania","41 00 N","20 00 E" "Algeria","28 00 N","3 00 E" "American Samoa","14 20 S","170 00 W" "Andorra","42 30 N","1 30 E" "Angola","12 30 S","18 30 E"
"Afghanistan","33 00 N","65 00 E"
"Akrotiri","34 37 N","32 58 E"
"Albania","41 00 N","20 00 E"
"Algeria","28 00 N","3 00 E"
"American Samoa","14 20 S","170 00 W"
"Andorra","42 30 N","1 30 E"
"Angola","12 30 S","18 30 E"
"Korea, North","40 00 N","127 00 E"
"Korea, South","37 00 N","127 30 E"
解剖第一行,我们有名字(阿富汗),纬度(北纬33度)和经度(东经65度)。我要寻找的结果如下:
"Afghanistan","33","65"
"Akrotiri","34.62","32.97"
"Albania","41","20"
"Algeria","28","3"
"American Samoa","-14.34","-170"
"Andorra","42.5","1.5"
"Angola","-12.5","18.5"
"Korea, North","40","127"
"Korea, South","37","127.5"
它只是简单地携带整个度数,将分钟数相加为小数(除以60并取整),然后使用字符决定结果值是正(N,E)还是负(s,W)
- 纬度范围为0-90度
- 经度范围为0-180度和
- 两种情况下的分钟数都在0-59之间
awk -F'",' '{
gsub(/"/, "", $2);
gsub(/"/, "", $3);
split($2, a, " ");
split($3, b, " ");
s=a[3]=="N"? "":"-";
t=b[3]=="E"? "":"-";
printf "%s\",\"%s%.2f\",\"%s%.2f\"\n",
$1, s,(a[1]+a[2]/60), t,(b[1]+b[2]/60)
}' file
"Afghanistan","33.00","65.00"
"Akrotiri","34.62","32.97"
"Albania","41.00","20.00"
"Algeria","28.00","3.00"
"American Samoa","-14.33","-170.00"
"Andorra","42.50","1.50"
"Angola","-12.50","18.50"
"Korea, North","40.00","127.00"
"Korea, South","37.00","127.50"
我花了大约1:30小时来解决上述问题@阿努巴瓦在不到12分钟内解决了这个问题。非常感谢。它就像一个符咒。好吧,在更多的结果检查之后,我不幸地发现@anubhava answer有一些问题。起初,我没有在示例中包含带逗号的名称。我现在添加了它们,但不幸的是它扼杀了他的解决方案。@anubhava更新了他的解决方案,以处理名称字段中可能出现的逗号。我忘了把这个特例包括在原来的帖子里。我道歉。现在他的解决方案真的很有魅力。嗯,我确实发现你的解决方案有一些问题:有些条目的名称中有逗号“,”。例如“Korea,North”,“4000N”,“12700E”,“Korea,South”,“3700N”,“12730E”当前它返回“Korea”,“-0,00”,“-40,00”“Korea”,“-0,00”,“-37,00”,而不是“Korea”,“40,00”,“127,00”“Korea”,“37,00”,“127,5”,这些数据没有包含在您的示例中。您可能知道,解析此类数据可能需要成熟的CSV解析器。对于在原始帖子中遗漏此内容,我深表歉意。我很可能只是用某种占位符(下划线或类似的占位符)替换名称中的逗号,让您的解决方案来完成繁重的工作。从那以后,我就把它们换回来。好吧,我向你脱帽致敬,@anubhava。现在它真的很有魅力。你解决了我的问题,我已经花了一小部分时间。祝你在班加罗尔一切顺利!