显然我误解了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同意“备忘单”。)
答案 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