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

标签 linux bash sorting awk rrdtool

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

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 命令的输出通过管道传输到 sort -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 命令是否可以转换为一个)

最佳答案

由于数据仅包含 [0-9:.] 和换行符,因此 xargs 应该可以安全使用(一次),因此您可以丢失第二个 awk 并执行以下操作:

awk -F ',' '{gsub(/[\/:]/," ",$7); print mktime($7)":"$1":"$5}' MyFile | 
sort -n | 
xargs rddtool update ccdata2.rrd

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

编辑:

为了具有仅在纪元日期大于最后一个日期时打印一行的功能,我已将 awk 命令更新为以下内容:

awk -F ',' '{gsub(/[\/:]/," ",$7)} $7>p {print mktime($7)":"$1":"$5;p=$7}' MyFile |
sort -n | 
xargs rddtool update ccdata2.rrd

关于linux - rrdtool 使用 awk 和排序从多个平面文件更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486291/

相关文章:

linux - *nix 上的伪文件系统

c - 将映射交换到虚拟内存中两个页面的两个物理页面

java - 按日期时间对 LinkedHashset 进行排序

linux - 在 LINUX 上动态运行控制台到 TTY

Linux 证书生成

bash - bash 参数扩展/字符串操作的兼容性

linux - 反向合并文件

bash - 如何使用 jq 从 json 获取 id?

arrays - 合并排序如何处理长度为 N 的数组?

javascript - fs.readdir 首先同步目录