如何用jq将定时生成的temp.json数据追加到stats.json数组中?
解决JSON合并问题:用jq将temp.json合并到stats.json
我来帮你搞定这个合并的问题!首先得明确你要的合并逻辑——是覆盖同名属性(比如temp里的键值替换stats里的),还是追加数组元素,或者是其他复杂结构?我先给两种最常见场景的解决方案,你可以根据自己的JSON结构调整。
场景1:对象属性合并(覆盖同名键)
如果你的stats.json和temp.json都是扁平的对象结构,比如:
stats.json初始内容:
{ "total_users": 100, "active_users": 30 }
temp.json新获取的数据:
{ "active_users": 35, "new_users": 5 }
想要合并后stats.json保留原有未修改的键,同时用temp的新值覆盖同名键、新增temp里的新键,用这个jq命令就能实现:
jq -s '.[0] * .[1]' stats.json temp.json > tmp.json && mv tmp.json stats.json
命令解释:
-s:把多个JSON文件读入一个数组,.[0]对应stats.json,.[1]对应temp.json*:jq的对象合并运算符,temp里的键会覆盖stats里的同名键,同时保留双方独有的键- 先写入临时文件再替换原文件,避免合并过程中损坏原stats.json
场景2:数组追加(把temp的数组元素加到stats的数组里)
如果你的JSON是包含数组的结构,比如需要累计每10分钟的统计数据:
stats.json:
{ "ten_minute_records": [ { "timestamp": "2024-05-20 10:00", "users": 30 }, { "timestamp": "2024-05-20 10:10", "users": 32 } ] }
temp.json:
{ "ten_minute_records": [ { "timestamp": "2024-05-20 10:20", "users": 35 } ] }
想要把temp的数组元素追加到stats的对应数组里,用这个命令:
jq -n 'input as $stats | input as $temp | $stats.ten_minute_records += $temp.ten_minute_records | $stats' stats.json temp.json > tmp.json && mv tmp.json stats.json
命令解释:
-n:不自动读取输入,手动控制数据处理流程input as $stats:读取第一个文件(stats.json)到变量$statsinput as $temp:读取第二个文件(temp.json)到变量$temp$stats.ten_minute_records += $temp.ten_minute_records:把temp的数组元素追加到stats的目标数组中- 最后输出修改后的$stats
完整的bash脚本(包含curl获取+合并)
把下面的内容保存成update_stats.sh,给脚本添加执行权限:chmod +x update_stats.sh
#!/bin/bash # 1. 从API获取数据到temp.json(替换成你的API地址) curl -s "https://your-api-url.com/stats" -o temp.json # 检查curl是否成功获取数据 if [ $? -ne 0 ]; then echo "[$(date)] 获取API数据失败,跳过本次合并" >> update_stats.log exit 1 fi # 2. 备份原stats.json(可选但推荐,防止合并出错丢失数据) cp stats.json stats.json.bak # 3. 执行合并(这里用场景1的命令,你可以换成场景2的命令) jq -s '.[0] * .[1]' stats.json temp.json > tmp.json && mv tmp.json stats.json # 检查合并是否成功 if [ $? -eq 0 ]; then echo "[$(date)] 数据合并成功" >> update_stats.log else echo "[$(date)] 合并失败,恢复备份文件" >> update_stats.log mv stats.json.bak stats.json fi # 清理临时文件 rm temp.json tmp.json 2>/dev/null
设置每10分钟执行的定时任务
用crontab -e打开定时任务编辑器,添加以下内容(替换成你的脚本路径):
*/10 * * * * /home/your-user/update_stats.sh
如果需要记录日志,可以改成:
*/10 * * * * /home/your-user/update_stats.sh >> /home/your-user/update_stats.log 2>&1
这样系统会每10分钟自动执行脚本,完成数据获取和合并。
如果你的JSON结构更复杂(比如嵌套对象、多层数组),可以把stats.json和temp.json的示例结构贴出来,我再帮你调整jq命令!
内容的提问来源于stack exchange,提问作者nelasx
相关产品推荐
相关产品推荐

