You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)到变量$stats
  • input 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:58:44