RHEL7.4下合并4个同结构文件的SUM数据用于gnuplot
嘿,我来帮你解决这个汇总需求!在RHEL7.4上用系统自带的awk工具就能轻松实现,不用额外装软件,完全符合你要的格式要求,一步步来:
1. 先明确原文件格式前提
我先假设你的101-104.txt每行是日期 + 字段名 + 数值的结构(比如 2024-01-31 received 28131),如果你的格式是CSV或者其他分隔方式,后面的脚本可以简单调整,我会顺便提一下。
2. 写个awk脚本实现累加
创建一个叫sum_fields.awk的脚本文件,把下面的内容粘进去:
# 遍历所有输入文件的每一行,用日期+字段名当唯一键来累加数值 { key = $1 " " $2 total[key] += $3 } # 所有文件处理完后,按原格式输出汇总结果 END { for (k in total) { split(k, parts, " ") print parts[1], parts[2], total[k] } }
这个脚本的逻辑很简单:把每个日期+字段的组合当成唯一标识,把对应数值累加起来,最后再按原文件的格式输出。
3. 执行脚本生成汇总文件
打开终端,跑到你存放这些txt文件的目录,执行下面的命令:
awk -f sum_fields.awk 10[1-4].txt > summary_data.txt
这条命令会把101到104四个文件都喂给awk脚本,最后生成summary_data.txt就是你要的汇总文件。
4. 验证结果是否符合要求
比如如果101.txt和102.txt里都有2024-01-31 received 28131,那汇总后的文件里对应行就是2024-01-31 received 56262,完全和你说的一致,而且格式和原文件一模一样,直接就能给gnuplot用。
额外:如果原文件是CSV或其他分隔格式
要是你的文件是CSV(比如2024-01-31,received,28131),只需要修改脚本的开头,指定分隔符就行:
BEGIN { FS = "," } # 把分隔符设为逗号 { key = $1 "," $2 total[key] += $3 } END { for (k in total) { print k "," total[k] } }
执行命令还是类似的,把输出改成.csv后缀就行:
awk -f sum_fields.awk 10[1-4].txt > summary_data.csv
这样生成的文件直接就能在gnuplot里用,比如画received字段的趋势图,直接用plot "summary_data.txt" using 1:3 title "Received Total" with lines这类命令就OK了。
内容的提问来源于stack exchange,提问作者Goose

