exiftool

时间:2018-01-29 13:52:08

标签: perl printf exiftool

显然我误解了printf手册页。 (或者它是exiftool 10.55和10.77中的一个错误)

我正在尝试使用exiftool从图像文件中获取GPS坐标。我想让它们具有相同的宽度,没有不必要的空间。

我尝试过的格式字符串,其中一个结果是:

-coordFormat "%03d°%02d′%0d%02.5f″"
042°37′280.00000″ N, 002°05′510.00000″ W

(我不需要五个小数位 - 我只是暂时把它放在一起看看是否有任何相机对于精度是不诚实的。)三个不必要的空间无法帮助;它们超出了格式字符串的控制范围,但我确实摆脱了默认情况下的其他字符串。纬度的前导零不是必需的,但它存在,因为经度使用相同的格式字符串。一个问题是在楼层(秒)和小数点之间插入虚假零点。另一个问题是错误的小数部分。该文件的默认格式为42 deg 37' 28.39" N, 2 deg 5' 51.96" W

某人的“cheat sheet”说我的第二个数字应该是宽度,包括小数点,所以我将秒数改为“%08.5f”,但所有这一切都是在小数点前添加另一个虚假零,例如510.00000→5100.00000(宽度为10,而不是8!)。

几年前,我做了类似的事情,得到了正确的结果。但我没有费心将脚本保存为“供将来参考。”

(其他几个SO answers同意“备忘单”。)

3 个答案:

答案 0 :(得分:0)

%0d让你失望。模板的那部分正在消耗" 51.0"坐标的秒组件,不为模板的%02.5d部分留下任何内容。

printf "%0d", 51         ===>   "51"
printf "%02.5f";         ===>   "0.00000"

printf "%0d%02.5f", 51   ===>   "510.00000"

失去%0d

2中的%02.5f对您没有任何好处。小数位前面的数字是字段的最小长度,小数位后面的数字是要使用的小数位数。由于将打印5个小数位,输出将至少为7个字符,2值将被忽略。

答案 1 :(得分:0)

看起来问题出在 seconds 字段,您有格式说明符%0d%02.5f。我不确定你的意图,但每个值只能有一个%

如果你正在格式化经度,那么你正在处理-180和180之间的值。如果你想要五个小数点,那么总宽度将是

  • 符号+-
  • 的一个字符
  • 整数部分的三个字符
  • 小数点.
  • 的一个字符
  • 五个小数位数

总场宽为10。您的完整说明符为%0+10.5f,输出介于«-180.00000»和«+180.00000»之间

您可以使用空格标记而不是+,例如%0 10.5f,它将使用空格而不是+来表示正数,将180渲染为«180.00000 »。前导零是有的,因此使用零来填充整个十字符字段

处理纬度时,您需要一个较小的总宽度。 %0+9.5f将导致«-90.00000»到«+90.00000»的范围。当然,您可以使用与经度相同的格式说明符,这将生成«-090.00000»到«+090.00000»。这样,纬度和经度秒将具有相同的字符数

答案 2 :(得分:-2)

第一个数字是宽度,第二个数字是小数点数,因此您当前(%2.5f)的数字似乎是向后的。 %5.2f会给你一个占5个字符并且有2个小数位的数字。对于大到510的数字,您可能希望将其设为%6.2f