如何在Bash中更精确获取过去1小时的价格变动数据?
更精确匹配过去1小时数值的方法
嘿,针对你的需求,我整理了几个比当前脚本更精准的方案,你可以根据实际数据情况选择:
1. 匹配最接近1小时前的记录(推荐)
如果你的数据库记录不是严格按固定间隔生成的,原脚本的±120秒窗口可能会错过更贴近1小时前的数据,甚至窗口内没有数据。这种情况下,找和目标时间戳差值最小的记录会更靠谱:
首先计算1小时前的精确时间戳:
target_ts=$(($(date +%s) - 3600))
然后用awk遍历所有记录,找出时间戳最接近target_ts的数值:
closest_value=$(sort -u /home/f/dbfile | awk -v target="$target_ts" ' BEGIN { min_diff = 1000000000 # 初始化一个很大的差值 result = "" } { # 计算当前时间戳和目标时间的差值绝对值 diff = ($1 > target) ? $1 - target : target - $1 # 如果当前差值更小,更新结果 if (diff < min_diff) { min_diff = diff result = $2 } } END { print result } ')
这个脚本会自动帮你找到和“1小时前”时间点最接近的数值,不管这个记录是在1小时前的前后哪个方向,比固定窗口更灵活准确。
2. 严格匹配过去1小时范围内的记录
如果你需要的是“从1小时前到现在”这个时间段内的所有数值(而不是某个点),可以直接调整过滤条件,去掉固定的±120秒限制:
start_ts=$(($(date +%s) - 3600)) end_ts=$(date +%s) # 获取过去1小时内的所有数值,你可以根据需求取最后一条、第一条或平均值 last_hour_values=$(sort -u /home/f/dbfile | awk -v start="$start_ts" -v end="$end_ts" '$1 >= start && $1 <= end {print $2}') # 比如取这个时间段的最后一条记录 latest_in_hour=$(echo "$last_hour_values" | tail -1) # 或者取第一条记录 earliest_in_hour=$(echo "$last_hour_values" | head -1)
3. 精准匹配刚好1小时前的记录(如果存在)
如果你的数据里刚好有和1小时前时间戳完全一致的记录,可以直接精准匹配:
target_ts=$(($(date +%s) - 3600)) exact_value=$(sort -u /home/f/dbfile | awk -v target="$target_ts" '$1 == target {print $2}')
不过这种情况比较少见,因为时间戳通常是精确到秒的,刚好命中的概率不高,所以还是第一种方法实用性更强。
内容的提问来源于stack exchange,提问作者Abdul Ahmed
相关产品推荐
相关产品推荐

