1

サーバーのディスク使用量の折れ線グラフを描画するための基本的な構文を理解しようとしています。データは、明らかに新しいデータを同じ行ではなく別の行に格納する Oracle データベースに格納されます。私がこれまでに読んだことから、g​​nuplot は関連するデータが同じ行にあることを好むようです。私のデータは次のようになります。

#disk date     GB_used
disk1 20121022 99
disk1 20121023 104
disk2 20121022 170
disk2 20121023 182

gnuplot はこの形式のデータを扱えますか? グラフ出力には、disk1 用と disk2 用の 2 つの線が含まれます。データ ファイルには数個の disk_numbers しかありませんが、最終的には毎日のレコードから何百もの行が含まれます。

4

2 に答える 2

2

はい、できますが、少しだまさなければならない場合があります。基本的なプロットコマンドは次のとおりです。

plot "< sed 's/^disk//' data.dat" using ($1==1?$2:1/0):3 title 'disk 1', \
 '' using ($1==2?$2:1/0):3 title 'disk 2'

まず、データファイルを実行して、sed各行から文字列「disk」を削除します。次に、gnuplotはusingキーワードの後に​​条件付き比較を行います。最初のplotコマンドでは、最初のデータ列が1に等しいかどうかをチェックします(「disk1」-「disk」の場合)。そうである場合は、2番目の列と3番目の列をプロットします。そうでない場合は、1/0をプロットします。 (gnuplotは無視します)。

私は純粋なgnuplotでそれをやってみました:

plot 'data.dat' u ($1 eq 'disk1'?$2:1/0):3 t 'disk 1', \
 '' u ($1 eq 'disk2'?$2:1/0):3 t 'disk 2'

しかし、それはプロットコマンドの文字列比較が好きではありませんでした。

時間形式を正しくするために、あなたは次のようなことをしたいと思うでしょう

set xdata time
set timefmt '%Y%m%d'
set format x '%F'

プロットコマンドの前。

編集:@mgilsonが指摘したようにstrcol、「純粋なgnuplot」ソリューションが必要な場合は、このコマンドを使用できます。

plot 'data.dat' u (strcol(1) eq 'disk1'?$2:1/0):3 t 'disk 1', \
     '' u (strcol(1) eq 'disk2'?$2:1/0):3 t 'disk 2'
于 2012-10-23T14:14:53.943 に答える
2

disk1 と disk2 の GB_used と date をプロットしたいとします。その場合、これはほとんどgnuplot が好むフォーマットです:

#disk date     GB_used
disk1 20121022 99
disk1 20121023 104


disk2 20121022 170
disk2 20121023 182

これを変換する簡単な awk スクリプトを次に示します。

awk 'BEGIN{getline;x=$1;print $0}{if($1!=x){print '\n\n';print$0;x=$1}else{print $0}}' example.dat

この場合、gnuplot は 2 つのデータセットを 1 行または 2 行の空白行で区切ることを要求します。1 行の空白行で区切ると、gnuplot は同じ線種の 2 行をプロットします。

2 つの空白行で区切ると、gnuplot は両方のデータセットをプロットし、異なる線種でプロットすることができます:

plot for [idx=0:1] 'example.dat' i idx u 2:3 w lines

@andyras の回答に示されているように、フィルタリングによって本質的に同じ効果を得ることができます。

于 2012-10-23T14:16:27.347 に答える