이미지의 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
(아마도 /1000
a)가 이전 숫자의 분모라는 것을 알고 있습니다.
다음 요소를 고려하십시오.
- 높은 정밀도가 필요하지 않으므로 마지막 숫자의 소수점 이하 두 자리를 삭제할 수 있습니다(예: 대신
1088/100
될 수 있음 ).10
10.88
- 나는 그런 정확성이 있었으면 좋겠다.
- 좌표의 처음 두 숫자(도와 분, 즉
10/1 10/1
:)에도 소수점이 있을 수 있는지 확실하지 않습니다. 이 경우 세계의 여러 장소를 가리키는 좌표의 정확도가 완전히 엉망이 됩니다.
계산을 수행하고 실제로 분수를 숫자로 바꾸려면 이 스크립트를 어떻게 수정해야 합니까(좀 더 우아하게 만들 수 있습니까?)
답변1
이렇게 하는 것은 매우 복잡합니다 sed
. 더 적합한 도구는 awk
또는 입니다 bc
. 예를 들어 bc
add 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" 패턴이 포함되어 있으면 공백을 인쇄하고, 그렇지 않으면 줄 바꿈을 인쇄합니다.