正如标题所示,我将数据存储在多个平面文件中,格式如下:
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 命令:
awk -F ',' '{gsub(/[\/:]/," ",$7); print mktime($7)":"$1":"$5}' MyFile
这给了我如下输出(日期转换为纪元,冒号分隔符并移动了一点):
1305068406:215:16.4
1305068430:215:16.3
1305068411:217:16.3
1305068417:213:16.3
1305068423:215:16.3
由于在写入文件时出现了一些问题,输入文件可能没有按日期顺序排列,所以接下来我将上面的 awk 命令的输出通过管道传输到 asort -n
中,这将确保数据按数字排序,最旧的纪元时间在顶部。
1305068406:215:16.4
1305068411:217:16.3
1305068417:213:16.3
1305068423:215:16.3
1305068430:215:16.3
然后我将排序后的输出传递到另一个 awk 命令中:
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 数据行
最终输出如下:
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 条记录,那就是(你明白了)
rrdtool update ccdata2.rrd x:x:x <100 times> && rrdtool update ccdata2.rrd x:x:x <another 100 times>
然后我将命令的输出通过管道传输到bash
,以便 shell 执行输出rrdtool update
命令。
完整的命令是:
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命令可以转换成一个)