我有date_geohash.json
名称格式的地理json文件,我必须将它们转换为date_latitude-longotude.json
格式。例如,我需要将2017-03-28_u13hhyn.json
转换为2017-03-28_N52.76-E1.62.json
。
我正在尝试编写一个bash脚本,以使用“重命名”和“ jq”(json查询)实用程序重命名这些json文件。使用jq可以从json文件提取纬度和经度。
jq '"\(.latitude)-\(.longitude).json"' 2017-03-28_u13hhyn.json
给我
“52.768471-1.623297.json"
但是,我不知道如何截断纬度和经度数字并重命名json文件。
答案 0 :(得分:0)
最好将纬度和经度提取到变量中,然后使用printf将其处理为所需的文件名格式。然后,只需重命名该文件。这是一个基本示例:
#!/bin/bash
declare directory="/some/directory/path"
declare pattern="*_*.json"
cd ${directory}
for file in ${pattern}; do
prefix=${file%%_*} # Remove first underscore and everything following.
latitude=$(jq '.latitude' ${file})
longitude=$(jq '.longitude' ${file})
new_name=$(printf "%s_N%.2f-E%.2f.json" ${prefix} ${latitude} ${longitude})
mv ${file} ${new_name}
done;
注1:printf不会截断数字,而是将它们四舍五入,这将给出更准确的结果。
注2:我将“ N”和“ E”硬编码到文件名中,假设纬度和经度对S和W均为负。如果不是这种情况,则需要做更多的工作是必需的,但原理保持不变。
答案 1 :(得分:0)
按照安德鲁的代码,我得出结论:
#!/bin/bash
for file in *.json; do
prefix=${file%%_*}
latitude=$(jq '.latitude' ${file})
longitude=$(jq '.longitude' ${file})
if (( $(echo "$longitude > 0" | bc -l) )); then
new_name=$(printf "%s_N%.2f-E%.2f.json" ${prefix} ${latitude} ${longitude})
else
Longitude=${longitude#-}
new_name=$(printf "%s_N%.2f-W%.2f.json" ${prefix} ${latitude} ${Longitude})
fi
mv ${file} ${new_name}
done;
我想知道如何使用一个printf而不是两个?