编写Shell脚本计算两个文件对应行的百分比变化
解决对应行百分比变化计算的Shell脚本方案
我来帮你搞定这个需求!要计算两个文件对应行的百分比变化,还能定时每5分钟自动处理,用Shell脚本结合几个基础工具就能轻松实现。
单次计算的核心逻辑
首先,我们可以用paste命令把a.txt和b.txt的对应行合并到一起,然后用awk来做数值计算。假设你要的是相对于b.txt数值的百分比变化,公式就是:((a_value - b_value) / b_value) * 100(如果你的基准是a.txt,把分母换成a_value就行)。
直接在终端运行这条命令就能得到结果:
paste a.txt b.txt | awk '{change = (($1 - $2)/$2)*100; printf "%.6f%%\n", change}'
paste a.txt b.txt:把两个文件的对应行合并,每行的两个数值用制表符分隔awk部分:提取每行的第一个值(a.txt的数)和第二个值(b.txt的数),计算百分比变化,用printf格式化输出保留6位小数并加上百分号
如果你需要把结果保存到新文件里,直接重定向就行:
paste a.txt b.txt | awk '{change = (($1 - $2)/$2)*100; printf "%.6f%%\n", change}' > result.txt
封装成可复用的脚本
把上面的逻辑写成一个脚本文件,比如calculate_change.sh,方便后续定时调用:
#!/bin/bash # 定义文件路径(根据你的实际路径调整) FILE_A="./a.txt" FILE_B="./b.txt" RESULT_FILE="./change_result.txt" # 检查文件是否存在 if [ ! -f "$FILE_A" ] || [ ! -f "$FILE_B" ]; then echo "错误:a.txt或b.txt不存在!" exit 1 fi # 检查行数是否一致(可选,因为你说每次记录数一致,但加个保险) lines_a=$(wc -l < "$FILE_A") lines_b=$(wc -l < "$FILE_B") if [ "$lines_a" -ne "$lines_b" ]; then echo "错误:两个文件行数不一致!" exit 1 fi # 计算百分比变化并保存结果 paste "$FILE_A" "$FILE_B" | awk -v result="$RESULT_FILE" '{ change = (($1 - $2)/$2)*100; printf "%.6f%%\n", change > result }' echo "计算完成,结果已保存到$RESULT_FILE"
给脚本加执行权限:
chmod +x calculate_change.sh
运行脚本测试:
./calculate_change.sh
每5分钟自动执行(定时任务)
用crontab来设置定时任务,让脚本每5分钟跑一次:
- 编辑crontab配置:
crontab -e
- 在末尾添加一行(注意替换成你的脚本实际路径):
*/5 * * * * /path/to/your/calculate_change.sh >> /path/to/your/cron_log.log 2>&1
*/5 * * * *:表示每5分钟执行一次- 后面的
>> /path/to/your/cron_log.log 2>&1是把脚本的输出和错误信息保存到日志文件,方便排查问题
保存退出后,crontab就会自动生效了。
内容的提问来源于stack exchange,提问作者getashu1
相关产品推荐
相关产品推荐

