# Interpret a sexagesimal # Trigo function asin(x) { return(atan2(x,sqrt(1.-x*x))) } function acos(x) { return((PI/2.) - asin(x)) } function atan(x) { return(atan2(x,1)) } function cosd(x) { return(cos(x*DEG)) } function sind(x) { return(sin(x*DEG)) } function asind(x) { return(asin(x)/DEG) } function acosd(x) { return(acos(x)/DEG) } function atand(x) { return(atan2(x,1)/DEG) } function atan2d(x,y) { return(atan2(x,y)/DEG) } function sexa(str) { # Find the components _sexa = str; sub(/^ */, "", _sexa); if (_sexa == "") return(NaN); if (substr(_sexa,1,1) == "-") { _sexa = substr(_sexa, 2); _ssex = -1. } else _ssex = 1; if (_sexa ~ /[0-9]:[0-9]/) _nsex = split(_sexa, _asex, ":"); else _nsex = split(_sexa, _asex); return((_asex[1] + _asex[2]/60. + _asex[3]/3600.)*_ssex); } # Interpret longitude + latitude (degrees) function lonlat(str, o) { _ipos = match(str, /[,+-]/); if (_ipos>0) { o[1] = sexa(substr(str, 1, _ipos-1)); o[2] = sexa(substr(str, _ipos+1)); if (substr(str, _ipos,1)=="-") o[2] = -o[2]; return; } # No sign or comma to separate components ! _sexa = str; sub(/^ */, "", _sexa); _nsex = split(_sexa, _osex); if (_nsex < 2) { o[1] = sexa(str); o[2] = NaN; return } if (_nsex == 2) { o[1] = sexa(_osex[1]); o[2] = sexa(_osex[2]); return } _ksex = int((_nsex+1)/2); for (_isex=2; _isex<=_ksex; _isex++) _osex[1] = _osex[1] " " _osex[_isex]; _osex[2] = _osex[_isex]; for (_isex++; _isex<=_nsex; _isex++) _osex[2] = _osex[2] " " _osex[_isex]; o[1] = sexa(_osex[1]); o[2] = sexa(_osex[2]); return; } # Interpret RA + Dec from a string into o[1] + o[2] function radec(str, o) { lonlat(str, o); o[1] *= 15; } # Distance between 2 positions function sphDist(a,b) { return(3600*acosd(cosd(a[1]-b[1])*cosd(a[2])*cosd(b[2]) + sind(a[2])*sind(b[2]))); } ## table4: #J000817+400223 00 08 17 +40 02 23 28/09/2008 600 #J000825+400345 00 08 25 +40 03 45 28/09/2008 600 #J001036+400314 00 10 36 +40 03 14 25/09/2008 600 #J001117+402202 00 11 17 +40 22 02 26/09/2008 800 #J001502+412756 00 15 02 +41 27 56 28/09/2008 600 BEGIN { PI = 4.*atan2(1.,1.); DEG=PI/180.; ARCMIN=DEG/60.; ARCSEC=DEG/3600.; LOG10 = log(10); NaN="-nan"+0 while (("fcat table4.dat" | getline)>0) { id[$1] = ""; as[$1] = 999.99; radec(substr($0,16,18), o); ra[$1] = o[1]; de[$1] = o[2]; } } END { for(i in id) { printf "%s : %s [r=%.2f]\n", i, id[i], as[i] } } ## table2: # 1 GALEX J000639.12+402641.2 00 06 39.12 +40 26 41.2 21.50 0.12 20.79 0.05 99.99 0.99 N # 2 GALEX J000639.68+402949.3 00 06 39.68 +40 29 49.3 99.99 -1.00 19.54 0.02 99.99 0.98 N # 3 GALEX J000640.06+403418.4 00 06 40.06 +40 34 18.4 99.99 -1.00 19.41 0.02 99.99 1.00 N # 4 GALEX J000642.73+402405.4 00 06 42.73 +40 24 05.4 99.99 -1.00 22.16 0.10 99.99 1.00 N # 5 GALEX J000643.10+402835.3 00 06 43.10 +40 28 35.3 99.99 -1.00 20.78 0.04 99.99 0.98 N { if ((NR%1000)==0) printf "#...%d [%d assigned]\n", NR, n; radec(substr($0,33,24),o); for(i in id) { b[1] = ra[i]; b[2] = de[i]; r = sphDist(b,o); if(r