Regex 将地理坐标转换为十进制值

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"

我有一个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"
"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之间
我尝试了我有限的正则表达式知识,但失败了。我甚至没有接近有用的东西

这就是为什么我要求助于你们这些regex大师,请和我分享你们的一些广博知识

感谢您使用awk:

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。现在它真的很有魅力。你解决了我的问题,我已经花了一小部分时间。祝你在班加罗尔一切顺利!