首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用awk和排序从多个平面文件中更新rrdtool

使用awk和排序从多个平面文件中更新rrdtool
EN

Stack Overflow用户
提问于 2012-07-14 18:28:44
回答 1查看 1.2K关注 0票数 2

如标题所示,数据存储在多个平面文件中,格式如下:

代码语言:javascript
运行
复制
215,,,215,16.4,0,2011/05/11 00:00:06
215,,,215,16.3,0,2011/05/11 00:00:23
217,,,217,16.3,0,2011/05/11 00:00:11
213,,,213,16.3,0,2011/05/11 00:00:17
215,,,215,16.3,0,2011/05/11 00:00:30

我目前正在使用以下awk命令:

代码语言:javascript
运行
复制
awk -F ',' '{gsub(/[\/:]/," ",$7); print mktime($7)":"$1":"$5}' MyFile

这给了我如下的输出(日期转换为纪元,冒号分隔符,并移动了一点):

代码语言:javascript
运行
复制
1305068406:215:16.4
1305068430:215:16.3
1305068411:217:16.3
1305068417:213:16.3
1305068423:215:16.3

由于写入文件时出现了一些问题,输入文件可能没有按日期排序,所以接下来我将把上面的awk命令的输出输入到一个sort -n中,这将确保数据以最古老的时间在顶部进行数字排序。

代码语言:javascript
运行
复制
1305068406:215:16.4
1305068411:217:16.3
1305068417:213:16.3
1305068423:215:16.3
1305068430:215:16.3

然后,我将排序的输出传递到另一个awk命令中:

代码语言:javascript
运行
复制
awk -F ':' 'BEGIN {ORS=" ";c="rrdtool update ccdata2.rrd"; print c} NR % 100 == 0 {print "&& "c} $1>p {print $0;p=$0}'

这将生成下面的输出,并确保几个规则:

  • 每100个记录,打印一个&&和一个新的rrdtool update ccdata.rrd前缀(似乎rrdtool喜欢有大量记录的更新)
  • 只有当时代时间大于上一次时,才打印出rrd数据线。

最后的产出如下:

代码语言:javascript
运行
复制
rrdtool update ccdata2.rrd 1305068406:215:16.4 1305068411:217:16.3 1305068417:213:16.3 1305068423:215:16.3 1305068430:215:16.3

如果有300条记录,那就是(你知道了)

代码语言:javascript
运行
复制
rrdtool update ccdata2.rrd x:x:x <100 times> && rrdtool update ccdata2.rrd x:x:x <another 100 times>

然后,我将命令的输出传递给bash,以便shell执行输出rrdtool update命令。

完整的命令是:

代码语言:javascript
运行
复制
awk -F ',' '{gsub(/[\/:]/," ",$7); print mktime($7)":"$1":"$5}' MyFile | sort -n | awk -F ':' 'BEGIN {ORS=" ";c="rrdtool update ccdata2.rrd"; print c} NR % 100 == 0 {print "&& "c} $1>p {print $0;p=$0}' | bash

如何改进上述过程?你如何实现同样的目标?请在你的回答中说明原因。(即两个awk命令能否转换为一个)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-14 19:03:35

因为数据只包含0-9:。而换行符,xargs应该是安全的使用(一次),这样您就可以失去第二个awk并这样做:

代码语言:javascript
运行
复制
awk -F ',' '{gsub(/[\/:]/," ",$7); print mktime($7)":"$1":"$5}' MyFile | 
sort -n | 
xargs rddtool update ccdata2.rrd

xargs会将尽可能多的参数压缩到rddtool命令中,如果参数数使其超过ARG_MAX,它将运行更多的命令,直到所有输入都被处理完毕。

编辑:

如果划时代日期大于上一个日期,则只有打印一行的功能,我已经更新awk命令如下:

代码语言:javascript
运行
复制
awk -F ',' '{gsub(/[\/:]/," ",$7)} $7>p {print mktime($7)":"$1":"$5;p=$7}' MyFile |
sort -n | 
xargs rddtool update ccdata2.rrd
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11486291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档