mirror of https://github.com/XEphem/XEphem.git
643 lines
11 KiB
Awk
Executable File
643 lines
11 KiB
Awk
Executable File
#!/bin/sh
|
|
#
|
|
# (l) 1996 by Pawel T. Jochym <ptj@pkpf.ifj.edu.pl>
|
|
#
|
|
# $Header: /home/ecdowney/telescope/GUI/xephem/tools/RCS/extract.awk,v 1.1 1996/08/26 19:40:53 ecdowney Exp $
|
|
#
|
|
# Shell (bash)/awk (gawk) script for extracting
|
|
# Comets orbital elements from various internet postings.
|
|
# It creates on stdout records in XEphem edb format from
|
|
# analysis of files enumerated in command line.
|
|
#
|
|
# Synopsis
|
|
# extr [file1 file2 ...]
|
|
#
|
|
# History:
|
|
#
|
|
# $Log: extract.awk,v $
|
|
# Revision 1.1 1996/08/26 19:40:53 ecdowney
|
|
# Initial revision
|
|
#
|
|
# Revision 1.2 1996/06/02 15:49:32 jochym
|
|
# First full implementation of Don Yeomas format decoder.
|
|
#
|
|
# Revision 1.1 1996/06/02 11:11:20 jochym
|
|
# Initial revision
|
|
#
|
|
#
|
|
# Yes, this is a free software (GPL).
|
|
#
|
|
# You can always send comments, additions,
|
|
# bug raports, money and beautiful woman
|
|
# to the above address.
|
|
#
|
|
|
|
SUFF=$$
|
|
TMPDIR="/tmp"
|
|
|
|
# Create file names
|
|
|
|
AWKENCKE=$TMPDIR/extract.encke.$SUFF
|
|
AWKYEOMAS=$TMPDIR/extract.yeomas.$SUFF
|
|
AWKSKYMAP=$TMPDIR/extract.skymap.$SUFF
|
|
AWKCOMET=$TMPDIR/extract.comet.$SUFF
|
|
AWKREC=$TMPDIR/extract.type.$SUFF
|
|
AWKTYPEOUT=$TMPDIR/extract.out.$SUFF
|
|
|
|
# Create awk scripts
|
|
|
|
# Type of file recognizer
|
|
|
|
cat >$AWKREC <<"EOF"
|
|
# AWK script for recognizing file type
|
|
# Returns (prints to stdout) name of file type
|
|
# ID's are:
|
|
# Yeomas
|
|
# Encke
|
|
# Comet
|
|
# SkyMap
|
|
# Unrecognized
|
|
|
|
# Initialization
|
|
|
|
BEGIN{
|
|
result="Unrecognized";
|
|
yeomas=0;
|
|
encke=0;
|
|
comet=0;
|
|
skymap=0;
|
|
}
|
|
|
|
END{
|
|
print result
|
|
}
|
|
|
|
# Don Yeomas format
|
|
|
|
/Don/ && /Yeomas/{
|
|
result="Yeomas"
|
|
if (++yeomas>3) exit;
|
|
}
|
|
|
|
/Planetary/ && /Ephemeris/{
|
|
result="Yeomas"
|
|
if (++yeomas>3) exit;
|
|
}
|
|
|
|
/\(with/ && /perturbations\)/{
|
|
result="Yeomas"
|
|
if (++yeomas>3) exit;
|
|
}
|
|
|
|
/Moon-Earth-Object/{
|
|
result="Yeomas"
|
|
if (++yeomas>3) exit;
|
|
}
|
|
|
|
/Corrected/ && /Elements/ && /Solution/{
|
|
result="Yeomas"
|
|
if (++yeomas>3) exit;
|
|
}
|
|
|
|
# Encke
|
|
|
|
/TWO/ && /BODY/ && /EPHEMERIS/ && /GENERATOR/{
|
|
result="Encke";
|
|
exit;
|
|
}
|
|
|
|
# Comet page format
|
|
|
|
|
|
/Latitude/ && /Longitude/ && /Magnetic/{
|
|
result="Comet"
|
|
exit;
|
|
}
|
|
|
|
|
|
# Sky Map page (html) format
|
|
|
|
/SkyMap/ && /Comet/ && /Orbital/{
|
|
result="SkyMap"
|
|
exit;
|
|
}
|
|
|
|
/Refer/ && /bottom/ && /page/ && /explanation/{
|
|
result="SkyMap"
|
|
exit;
|
|
}
|
|
|
|
EOF
|
|
|
|
#Result line generator
|
|
cat >$AWKTYPEOUT <<"EOF"
|
|
#Type out the result
|
|
# Get params in the following order:
|
|
# T e i o O q g k name
|
|
{
|
|
# print "# Got: "$0
|
|
if ( substr($1,1,1) == "#" ){
|
|
print "# " $0 ;
|
|
}else{
|
|
T=$1;
|
|
e=$2+0.0;
|
|
i=$3+0.0;
|
|
o=$4+0.0;
|
|
O=$5+0.0;
|
|
q=$6+0.0;
|
|
epoch=$7+0.0;
|
|
g=$8+0.0;
|
|
k=$9+0.0;
|
|
name=$10
|
|
for( l=11; l<=NF; l++ ) name=name " " $(l);
|
|
design=sprintf("%.13s",$10" "$11);
|
|
design=sprintf("%s",$10" "$11);
|
|
|
|
# print name, design
|
|
|
|
if (e < 1) {
|
|
# elliptical
|
|
a = q/(1-e);
|
|
printf "%-.13s,e,%.12g,%.12g,%.12g,%.12g,%.12g,%.12g,%.12g,%s,%.12g,g%g,%g #%s\n", \
|
|
design, i, O, o, a, 0, e, 0, T, epoch, g, k, name ;
|
|
} else if (e > 1) {
|
|
# hyperbolic
|
|
printf "%-.13s,h,%s,%.12g,%.12g,%.12g,%.12g,%.12g,%.12g,g%g,%g #%s\n", \
|
|
design, T, i, O, o, e, q, epoch, g, k, name ;
|
|
} else {
|
|
# parabolic
|
|
printf "%-.13s,p,%s,%.12g,%.12g,%.12g,%.12g,%.12g,g%g,%g #%s\n", \
|
|
design, T, i, o, q, O, epoch, g, k, name ;
|
|
}
|
|
}
|
|
}
|
|
|
|
EOF
|
|
|
|
#SkyMap posting extractor
|
|
|
|
cat >$AWKSKYMAP <<"EOF"
|
|
# AWK script for extracting orbital elements
|
|
# from SkyMap postings
|
|
|
|
BEGIN{
|
|
# print "# Sky Map decoder not implemented"
|
|
|
|
state=0;
|
|
CONVFMT="%.12g"
|
|
OFMT="%.12g"
|
|
|
|
mon["Jan"]=1;
|
|
mon["Feb"]=2;
|
|
mon["Mar"]=3;
|
|
mon["Apr"]=4;
|
|
mon["May"]=5;
|
|
mon["Jun"]=6;
|
|
mon["Jul"]=7;
|
|
mon["Aug"]=8;
|
|
mon["Sep"]=9;
|
|
mon["Oct"]=10;
|
|
mon["Nov"]=11;
|
|
mon["Dec"]=12;
|
|
|
|
epoch=2000.0;
|
|
g=5;
|
|
k=4;
|
|
}
|
|
|
|
/\<\/PRE\>/{
|
|
if ( state==6 || state==8 ) {
|
|
printf ("%s %.12g %.12g %.12g %.12g %.12g %.12g %.12g %.12g %s\n", \
|
|
T, e, i, o, O, q, epoch, g, k, name);
|
|
epoch=2000.0;
|
|
g=5;
|
|
k=4;
|
|
state=0;
|
|
}
|
|
}
|
|
|
|
/\<HR\>/{
|
|
if ( state==0 ) state=1;
|
|
|
|
}
|
|
|
|
/\<H4\>/ && /\<\/H4\>/{
|
|
if ( state==1 ) {
|
|
state=2;
|
|
name=substr($0,10);
|
|
name=substr(name,2,length(name)-6);
|
|
# print "#"name
|
|
# if ( substr(name,2,1) == "/" ) {
|
|
# # tmpname=substr(name,6);
|
|
# name=substr(name,3,4)"/"substr(name,1,1)substr(name,7);
|
|
# # print "#"name
|
|
# }
|
|
}
|
|
}
|
|
|
|
/\<PRE\>/{
|
|
if ( state==2 ) {
|
|
state=3 ;
|
|
}
|
|
}
|
|
|
|
/Epoch/{
|
|
if (state==3) {
|
|
#This is anly an approximation !
|
|
epoch=$3+(mon[$4]-1)/12+($5/365);
|
|
}
|
|
}
|
|
|
|
/T:/ && /w:/ {
|
|
if ( state==3 ) {
|
|
state=4;
|
|
o=$7+0.0;
|
|
T=sprintf("%d/%g/%d", mon[$3]+0, $4+0.0, $2+0);
|
|
}
|
|
}
|
|
|
|
/e:/ && /W:/ {
|
|
if ( state==4 ) {
|
|
state=5;
|
|
O=$4+0.0;
|
|
e=$2+0.0;
|
|
}
|
|
}
|
|
|
|
/q:/ && /i:/ {
|
|
if ( state==5 ) {
|
|
state=6; #exit state
|
|
q=$2+0.0;
|
|
i=$4+0.0;
|
|
}
|
|
}
|
|
|
|
/Magnitude/ && /parameters/{
|
|
if (state==6) {
|
|
state=7;
|
|
}
|
|
}
|
|
|
|
/H\ =/ && /G\ =/{
|
|
if (state==7) {
|
|
state=8; #exit state
|
|
g=$3+0.0;
|
|
k=$6+0.0;
|
|
}
|
|
}
|
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
#Comets page posting extractor
|
|
|
|
cat >$AWKCOMET <<"EOF"
|
|
# AWK script for extracting orbital elements
|
|
# from Comets page postings
|
|
|
|
BEGIN{
|
|
}
|
|
|
|
|
|
EOF
|
|
|
|
#Don Yeomas posting extractor
|
|
|
|
cat >$AWKYEOMAS <<"EOF"
|
|
# AWK script for extracting orbital elements
|
|
# from Don Yeomas postings
|
|
|
|
BEGIN{
|
|
# print "# Don Yeomas decoder"
|
|
|
|
mon["Jan"]=1;
|
|
mon["Feb"]=2;
|
|
mon["Mar"]=3;
|
|
mon["Apr"]=4;
|
|
mon["May"]=5;
|
|
mon["Jun"]=6;
|
|
mon["Jul"]=7;
|
|
mon["Aug"]=8;
|
|
mon["Sep"]=9;
|
|
mon["Oct"]=10;
|
|
mon["Nov"]=11;
|
|
mon["Dec"]=12;
|
|
|
|
epoch=2000.0;
|
|
object = ""
|
|
state = 0
|
|
nr_elems = 0;
|
|
}
|
|
|
|
|
|
END{
|
|
if (nr_elems>0) {
|
|
for( l=0; l<nr_elems; l++ ) {
|
|
time=epochs[l]
|
|
print "# Elements for "object" at "time
|
|
typeout(elems[time,"T"],\
|
|
elems[time,"e"],\
|
|
elems[time,"i"],\
|
|
elems[time,"o"],\
|
|
elems[time,"O"],\
|
|
elems[time,"q"],\
|
|
elems[time,"epoch"],\
|
|
elems[time,"g"],\
|
|
elems[time,"k"],\
|
|
elems[time,"com"]\
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
function addelem( time, T, e, i, o, O, q, epoch, comment )
|
|
{
|
|
epochs[nr_elems++]=time
|
|
elems[time,"T"]=T
|
|
elems[time,"e"]=e
|
|
elems[time,"i"]=i
|
|
elems[time,"o"]=o
|
|
elems[time,"O"]=O
|
|
elems[time,"q"]=q
|
|
elems[time,"epoch"]=epoch
|
|
# nr_of_fields=split(comment,arr);
|
|
# comment=""
|
|
# arr[2]=arr[2]"_"nr_elems;
|
|
# for( l=1; l<=nr_of_fields; l++ ) comment=comment" "arr[l];
|
|
elems[time,"com"]=comment
|
|
}
|
|
|
|
function updategk( g, k )
|
|
{
|
|
for( l=0; l<nr_elems; l++ ) {
|
|
elems[epochs[l],"g"]=g
|
|
elems[epochs[l],"k"]=k
|
|
}
|
|
}
|
|
|
|
function typeout( T, e, i, o, O, q, epoch, g, k, comment )
|
|
{
|
|
printf "%s %.12g %.12g %.12g %.12g %.12g %.12g %.12g %.12g %s\n", T, e, i, o, O, q, epoch, g, k, comment
|
|
}
|
|
|
|
# Pattern based recognizers implementing state machine
|
|
|
|
/Object:/ && /Comet/{
|
|
for(l=3;l<=NF;l++) {object=object" "$l;}
|
|
# print "# Object is: "object
|
|
}
|
|
|
|
/Corrected/ && /Elements/ && /Solution/{
|
|
if (state!=0) {print "# WHAT ?! state="state" in "; exit} else state++;
|
|
}
|
|
|
|
/Epoch/ && /=/{
|
|
if (state==1) {
|
|
etime=$6"/"$5"/"$4
|
|
};
|
|
}
|
|
|
|
/Post-Fit/ && /Std.Dev./{
|
|
if (state!=1) {print "# WHAT ?!"; exit} else state++;
|
|
}
|
|
|
|
|
|
/Elements/ && /at/ && /other/ && /epochs/{
|
|
if (state==9) {
|
|
state++
|
|
# print "# Other epochs block"
|
|
} else {
|
|
print "# WHAT ?! state="state" in "$0
|
|
}
|
|
}
|
|
|
|
/Epoch/ && /e/ && /q/ && /Node/ && /w/ && /i/ && /Tp/{
|
|
if (state==10) {
|
|
state++
|
|
# print "# Header line"
|
|
} else {
|
|
print "# WHAT ?! state="state" in "$0
|
|
}
|
|
}
|
|
|
|
/log/ && /Delta/ && /log/{
|
|
if (state==12) {
|
|
state++
|
|
} else {
|
|
print "# WHAT ?! state="state" in "$0
|
|
}
|
|
}
|
|
|
|
|
|
{
|
|
if ((state>1) && (state<8)) { # We are in the main elements block - collect the data
|
|
if ($1=="e") { e=$2+0.0 ; state++ }
|
|
else if ($1=="q") { q=$2+0.0 ; state++ }
|
|
else if ($1=="Tp") { T=mon[$5]"/"$6"/"$4 ; state++ }
|
|
else if ($1=="Node") { O=$2+0.0 ; state++ }
|
|
else if ($1=="w") { w=$2+0.0 ; state++ }
|
|
else if ($1=="i") { i=$2+0.0 ; state++ }
|
|
else if ($1=="Post-Fit") ;
|
|
else print "# WHAT ?! state="state" in "$0;
|
|
}else if (state == 8) { # We are past main block - add the result and search for additionals
|
|
# print "# Elements for epoch: "etime
|
|
addelem( etime, T, e, i, w, O, q, 2000.0, object );
|
|
state++;
|
|
}else if ((state == 11) && (NF==11)) { # We are at other epochs lines collect the data
|
|
etime=$3"/"$2"/"$1
|
|
# print "# Elements for epoch: "etime
|
|
T=mon[$10]"/"$11"/"$9
|
|
addelem( etime, T, $4+0.0, $8+0.0, $7+0.0, $6+0.0, $5+0.0, 2000.0, object );
|
|
} else if ((state == 11) && (NF==8)) { # We are at other epochs lines header - do nothing
|
|
;
|
|
} else if ((state == 11)) { # End of other epochs block - search for magnitude model
|
|
# print "# End of other epochs, NF="NF" state="state
|
|
state++
|
|
} else if (state==13) { # Magnitude line found - analyse it
|
|
state++;
|
|
# find position of first plus sign first
|
|
g_base=-1
|
|
k_base=-1
|
|
for(l=1;l<=NF;l++) {
|
|
if (index($l,"+")!=0) {
|
|
if (g_base==-1) {
|
|
g_base=l;
|
|
} else if (k_base==-1) {
|
|
k_base=l;
|
|
}
|
|
}
|
|
}
|
|
# print "# g_base="g_base" k_base="k_base
|
|
g=$(g_base-1)+0.0
|
|
k=$(k_base+1)
|
|
gsub("*log(r)","",k);
|
|
k=k/2.5
|
|
# print "# TMag line g="g" k="k" - "$0
|
|
updategk( g, k )
|
|
} else if (state==14) { # all done - type the result
|
|
state++;
|
|
}
|
|
}
|
|
|
|
EOF
|
|
|
|
#Encke posting extractor
|
|
|
|
cat >$AWKENCKE <<"EOF"
|
|
# AWK script for extracting orbital elements
|
|
# from encke postings
|
|
|
|
# Initialize
|
|
BEGIN{
|
|
FS="[=*+ \(\)]+"
|
|
state=0;
|
|
CONVFMT="%.12g"
|
|
OFMT="%.12g"
|
|
}
|
|
|
|
#Type out the result
|
|
END{
|
|
printf "%s %.12g %.12g %.12g %.12g %.12g %.12g %.12g %.12g %s\n", T, e, i, o, O, q, 2000.0, g, k, comment
|
|
}
|
|
|
|
# Pattern based recognizers
|
|
|
|
#Total magnitude line
|
|
/TOTAL/ && /MAGNITUDE/ {
|
|
# print "g=", $5," k=", $9 ;
|
|
# print $1, $2, $3, $4, $5, $6, $7, $8, $9, $10 ;
|
|
g=$5+0.0;
|
|
k=($9+0.0)/2.5;
|
|
}
|
|
|
|
#Name line
|
|
/EPHEMERIS/ && /FOR/ {
|
|
# print "Comet: " $8, $9, $10 ;
|
|
if ( $8=="Comet" ) {
|
|
pos=9;
|
|
}
|
|
else {
|
|
pos=8;
|
|
};
|
|
name = $(pos)$(pos+1);
|
|
comment="";
|
|
for (j=pos; j<NF; j++) {
|
|
if (j==pos) {
|
|
sub("/P","P",$(j));
|
|
sub("P/","P ",$(j));
|
|
}else{
|
|
sub("P/","P ",$(j));
|
|
}
|
|
comment=comment" "$(j);
|
|
# if ( index($(j),"C/")==1 ){
|
|
# comment = comment" "substr($(j),3);
|
|
# }else{
|
|
# comment = comment" "$(j);
|
|
# }
|
|
}
|
|
}
|
|
|
|
#Pre-elements lines
|
|
/THE/ && /ABOVE/ && /COMET/ && /EPHEMERIS/ && /IS/ && /BASED/{
|
|
# print "here 1:",$0 ;
|
|
if (state==0){
|
|
state=1 ;
|
|
# print 1 ;
|
|
}
|
|
}
|
|
|
|
/YR/ && /MN/ && /DY/ && /HR/{
|
|
# print "here 2" ;
|
|
if (state==1){
|
|
state=2 ;
|
|
# print 2 ;
|
|
}
|
|
}
|
|
|
|
|
|
{
|
|
# Main parameter colector
|
|
|
|
# print ":"$1":"$2":"$3":" $4":" $5":";
|
|
|
|
if (state==3){
|
|
# print "analyse"
|
|
# inclination
|
|
i = $11 + 0 ;
|
|
|
|
# long of asc node
|
|
O = $10 + 0 ;
|
|
|
|
# arg of peri
|
|
o = $9 + 0 ;
|
|
|
|
# eccentricity
|
|
e = $8 + 0 ;
|
|
|
|
# epoch of peri
|
|
T = sprintf ("%g/%g/%g", $3+0, $4+$5/24.0, $2+0) ;
|
|
|
|
# Year of peryhelion
|
|
y = $2 + 0 ;
|
|
|
|
# print y, $2 ;
|
|
|
|
# peri distance
|
|
q = $7 + 0 ;
|
|
|
|
# I have got elements
|
|
state = 4 ;
|
|
}
|
|
if (state==2){
|
|
state=3 ;
|
|
# print 3 ;
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# Run the script
|
|
|
|
for infile in $*; do
|
|
echo "# Elements from file: $infile ..."
|
|
case `awk -f $AWKREC < $infile` in
|
|
"Encke") awk -f $AWKENCKE < $infile ;;
|
|
"SkyMap") awk -f $AWKSKYMAP < $infile ;;
|
|
"Comet") awk -f $AWKCOMET < $infile ;;
|
|
"Yeomas") awk -f $AWKYEOMAS < $infile ;;
|
|
"Unrecognized") echo \# Unrecognized file format ;;
|
|
*) echo "# What ?!" ;;
|
|
esac
|
|
done | awk -f $AWKTYPEOUT
|
|
|
|
# Clean up
|
|
|
|
#less $AWKENCKE
|
|
|
|
rm $AWKYEOMAS
|
|
rm $AWKCOMET
|
|
rm $AWKENCKE
|
|
rm $AWKSKYMAP
|
|
rm $AWKREC
|
|
rm $AWKTYPEOUT
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# For RCS Only -- Do Not Edit
|
|
# @(#) $RCSfile: extract.awk,v $ $Date: 1996/08/26 19:40:53 $ $Revision: 1.1 $ $Name: $
|