根据文件内容重命名JSON文件

时间:2019-10-17 21:59:42

标签: json linux bash unix scripting

我有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文件。

2 个答案:

答案 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而不是两个?