The easiest/cleanest option is going to be just writing a short script in your favourite language that has an EXIF library you can use.
Yes you are likely correct. I did figure out a way to do it all in one line...
Pulled out all my linux knowledge. By some miracle Linux lets you combine all these text filter/manipulators, it's quite amazing that it actually works:
for f in *.jpg ; do identify -verbose "$f" | grep "Image:\|exif:GPSLatitude\|exif:GPSLongitude" | awk '{print}' ORS='; ' | sed "$ s/$/\n/"; done > output.txt
Ok, so let's chop this up into each piece...
for f in *.jpg ;
do identify -verbose "$f"
| grep "Image:\|exif:GPSLatitude\|exif:GPSLongitude"
| awk '{print}' ORS='; '
| sed "$ s/$/\n/";
done
> output.txt
Line 1. Go through all of the files named *.jpg.
Line 2. Do the command "identify" - verbose" on that file name.
Line 3. grep: display only lines with "Image:", "GPSLatitude" and "GPSLongitude" in them.
Line 4. awk: prints them all to the same line, separates records by "; " symbol.
Line 5. sed: adds a CR-LF to the end of the line (basically takes full output of awk and simply adds CR-LF).
Line 6. done refers to the "do" command in line 2.
Line 7. redirect all the output to "output.txt" file.
The resulting output looks like this:
Image: 1.jpg; exif:GPSLatitude: 35/1, 2/1, 5990/100; exif:GPSLatitudeRef: N; exif:GPSLongitude: 85/1, 18/1, 5540/100; exif:GPSLongitudeRef: W;
Image: 2.jpg; exif:GPSLatitude: 35/1, 2/1, 5420/100; exif:GPSLatitudeRef: N; exif:GPSLongitude: 85/1, 18/1, 5380/100; exif:GPSLongitudeRef: W;
Image: 3.jpg; exif:GPSLatitude: 35/1, 2/1, 5620/100; exif:GPSLatitudeRef: N; exif:GPSLongitude: 85/1, 18/1, 5440/100; exif:GPSLongitudeRef: W;
Image: 4.jpg; exif:GPSLatitude: 35/1, 2/1, 5720/100; exif:GPSLatitudeRef: N; exif:GPSLongitude: 85/1, 18/1, 5680/100; exif:GPSLongitudeRef: W;
Image: 5.jpg; exif:GPSLatitude: 35/1, 2/1, 5990/100; exif:GPSLatitudeRef: N; exif:GPSLongitude: 85/1, 18/1, 5390/100; exif:GPSLongitudeRef: W;
Image: 6.jpg; exif:GPSLatitude: 35/1, 2/1, 5996/100; exif:GPSLatitudeRef: N; exif:GPSLongitude: 85/1, 18/1, 5373/100; exif:GPSLongitudeRef: W;
Image: 7.jpg; exif:GPSLatitude: 35/1, 2/1, 5346/100; exif:GPSLatitudeRef: N; exif:GPSLongitude: 85/1, 18/1, 5412/100; exif:GPSLongitudeRef: W;
Image: 8.jpg; exif:GPSLatitude: 35/1, 2/1, 5235/100; exif:GPSLatitudeRef: N; exif:GPSLongitude: 85/1, 18/1, 5320/100; exif:GPSLongitudeRef: W;
Now to go back and figure out what this means, which will hopefully allow me to properly convert the data in Excel:
http://www.ridgesolutions.ie/index.php/2015/03/05/geotag-exif-gps-latitude-field-format/
Also, depending on where you use the GPS coordinates, you may have to correct them to your local grid system.
EDIT:
OK, the above article explains it very nicely. Thank you. It seems that the EXIF protocol allows you to specify how you want the DMS to be split up among the 6 "4-byte" values. For example, you have fractions A/B C/D E/F where A/B indicates deg, C/D is min, E/F is sec. The fractions give you the actual value. Some devices decide to ignore E/F completely and just put 0/1. In that case, the fraction for C/D is the min with decimal places (e.g. if C/D is 4044/100 then it becomes 40.44 min). In that case, A/B may be 52/1 4044/100 0/1 = 52 deg, 40.44 min. In the case where the software includes numbers for all of the 3 fractions A/B, C/D and E/F, then it is as follows: 32/1 4/1 4044/100 means 32 deg, 4 min, and 40.44 sec. To make this a decimal degree only, then 4 min + 40.44 sec/60 sec/min = 4 + 0.674 = 4.674 min. Then 32 deg + 4.674 min/60 min/deg = 32.0779 deg. Then in Google I just map degLat,degLon like this: 32.4232N,65.32423W (or whatever).
Once in Excel I can pick apart the strings and do the appropriate math calculations and add up the fractions to come up with the decimal degree format, hopefully not to difficult to parse out the individual numbers for A, B, C, D, E and F.