タイトルが示すように、私は次の形式で複数のフラットファイルにデータを保存しています。
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
次に、シェルが出力コマンドを実行できるように、コマンドの出力をにパイプします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
上記のプロセスをどのように改善できますか?どのようにして同じことを達成しますか?あなたの答えに理由を述べてください。(つまり、2つのawkコマンドを1つに変換できます)