bash 스크립트를 사용하여 GPS 좌표 변환

bash 스크립트를 사용하여 GPS 좌표 변환

이미지의 EXIF ​​정보 출력인 일부 GPS 좌표를 특정 형식으로 변환해야 합니다.

이는 일반적인 출력입니다.

exif:GPSLatitude: 10/1, 10/1, 10/1
exif:GPSLatitudeRef: N
exif:GPSLongitude: 10/1, 10/1, 10/1
exif:GPSLongitudeRef: E

이것은 내가 얻어야 할 문자열입니다:

10 10 10N 10 10 10E

다음 스크립트를 사용하여 이 작업을 수행할 수 있었습니다.

cat $somefile | sed "s/    /$nul/g" | sed "s/exif:GPSLatitudeRef: /$nul/g" | sed "s/exif:GPSLongitude:/$nul/g" | sed "s/exif:GPSLongitudeRef: /$nul/g" | sed "s/exif:GPSLatitude: /$nul/g" | sed "s/\/1/$nul/g" | sed "s/,/$nul/g" | tr -d '\n'

그러나 일부 이미지의 출력이 다음과 같이 약간 다르다는 것을 깨달았습니다.

exif:GPSLatitude: 10/1, 10/1, 1099/100
exif:GPSLatitudeRef: N
exif:GPSLongitude: 10/1, 10/1, 1088/100
exif:GPSLongitudeRef: E

나는 /1, /10/100(아마도 /1000a)가 이전 숫자의 분모라는 것을 알고 있습니다.

다음 요소를 고려하십시오.

  1. 높은 정밀도가 필요하지 않으므로 마지막 숫자의 소수점 이하 두 자리를 삭제할 수 있습니다(예: 대신 1088/100될 수 있음 ).1010.88
  2. 나는 그런 정확성이 있었으면 좋겠다.
  3. 좌표의 처음 두 숫자(도와 분, 즉 10/1 10/1:)에도 소수점이 있을 수 있는지 확실하지 않습니다. 이 경우 세계의 여러 장소를 가리키는 좌표의 정확도가 완전히 엉망이 됩니다.

계산을 수행하고 실제로 분수를 숫자로 바꾸려면 이 스크립트를 어떻게 수정해야 합니까(좀 더 우아하게 만들 수 있습니까?)

답변1

이렇게 하는 것은 매우 복잡합니다 sed. 더 적합한 도구는 awk또는 입니다 bc. 예를 들어 bcadd another을 사용하여 sed입력을 ";"으로 구분된 일련의 표현식(10/1)과 문자열(" ")로 변환하려고 합니다. 또는 개행 문자로 인해 bc는 다음을 입력합니다.

10/1;" "; 10/1;" "; 1099/100
"N \n"
10/1;" "; 10/1;" "; 1088/100
"E \n"

bc각 표현식이 평가되고 10.00 10.00 10.99N 10.00 10.00 10.88E원하는 대로 출력됩니다. sed|bc|tr에 필요한 것은 다음과 같습니다.

sed '1i\
scale=2
/Ref: /s/.$/"& \n"/
s/.*: //
s/,/;" ";/g
' | 
bc | tr -d '\n'

또는 awk모든 sed및 명령을 다음으로 바꿀 수 있습니다.tr

awk '
NF==4 { for(i=2;i<=4;i++){
         split($i,x,"/")
         printf "%s%g",i==2?"":" ",x[1]/x[2]
        }
      }
NF==2 { printf "%s%s",$2,$1~/Lat/?" ":"\n" }'

이렇게 하면 4개의 필드(공백으로 구분됨)가 있는 행을 찾고, 필드 2~4의 경우 필드 $i(예: "1099/100")를 "/" 문자에서 두 부분으로 분할합니다. 그런 다음 %g일반적인 숫자 형식(x[1]/x[2])을 사용하여 부분 2로 나누어진 부분 1을 인쇄합니다. 필드 2의 경우 %s에 있는 항목은 printf아무것도 없이 대체되고, 다른 2개의 필드에서는 공백으로 대체됩니다. 이렇게 하면 출력에서 ​​숫자가 구분됩니다.

2개의 필드(NF==2)가 있는 줄의 경우 두 번째 필드( $2)를 인쇄하고, 필드 1에 "Lat" 패턴이 포함되어 있으면 공백을 인쇄하고, 그렇지 않으면 줄 바꿈을 인쇄합니다.

관련 정보