2

タイトルが示すように、私は次の形式で複数のフラットファイルにデータを保存しています。

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つに変換できます)

4

1 に答える 1

3

データには [0-9:.] と改行のみが含まれているため、xargs(1 回だけ) 安全に使用できるはずです。

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
于 2012-07-14T19:03:35.037 に答える