LoginSignup
1
1

More than 5 years have passed since last update.

gnuplotで規則性のないファイル一覧を連続で描画して動画風にする

Last updated at Posted at 2016-02-15

ファイルの一覧を番号とともに標準出力に出力

<なにがしたいか>

  • C:\home下のファイル一覧を"数字 ファイル名"みたいな感じでテキストを出力する。
  • あえてawk使っているのは後でgnuplot中で使用するため。
1 foo.txt
2 bar.exe
...

みたいな出力がほしい。

<できたスクリプト>

row_ls.bat
dir "C:\home" /b | awk "{print NR,$0}"

<スクリプト中でやってること>

  1. dir/bでディレクトリ一覧を取得
  2. パイプ("|"←これ!)でawkに渡す
  3. awkが読み込んだ列数と、ファイル名を標準出力にprintしてくれる ( batchとして実行ではなく、コマンドだけコピーしてコマンドラインに打ち込むと通る。)

特定の行数だけ、ファイルの一覧を番号とともに標準出力に出力

<何がしたい>

  • C:\home下のファイル一覧を"数字 ファイル名"みたいな感じで出力するのはさっきと同じ。
  • 出力する数を限定したい。
  • 例えばファイルを4番から7番まで出力したい

<できたスクリプト>

row_ls.bat2
dir "C:\home" /b | awk "NR== 4,NR==7 {print NR,$0}"

<スクリプト中でやってること>

  1. C:\home下のファイルネームをdirする
  2. パイプでawkへ渡す
  3. awkで4-7行目までを"行数, ファイルネーム"の順で取り出す

なお行数を示す数字なぞいらなければ{print NR,$0}ではなく{print}だけにすればよろしい。


順番にプロットして動画チックにする

<なにがしたいか>

  • "C:\home\gnuplot\160101\"というディレクトリ下にソートすると順番になるファイル群(例えば"data160101_1001_00.txt","data160101_1002_00.txt","data160101_1003_00.txt",..."data160101_1100_00.txt")があるとする。
  • 指定したディレクトリ下のファイルネームを順番に取得してgnuplotの標準出力に連続して出力。
  • set outputでgifを指定すればgifファイルが出来上がる。

<できたスクリプト>

dofor_get_filename.gp
outdrct='C:\home\gnuplot\160101\'   #outdrctにrootディレクトリ格納
outdrct2='C:/home/gnuplot/160101/'  #outdrctにrootディレクトリ格納
drctpath=sprintf("%srawdata\\trace",outdrct)    # drctpathに目的のディレクトリ入れる(ココまではつなげてしまっても良い)



do for [i =1:100]{
    command=sprintf('dir %s /b | awk "NR==%4.0f{print}"',drctpath,i)    # ファイル名一覧を出力するdir /bしてパイプでawkに渡す
    data=system(command)
    print sprintf("%4.0f番目のファイルは%sです。",i,data)
    dataname=outdrct2.'rawdata/trace/'.data
    plot dataname
}

<スクリプト中でやってること>
outdrct内のファイルを連続でプロットするgp

  1. doforで取得する行を指定
  2. dir /bでファイル一覧を取得
  3. ファイル一覧のi番目のファイル名を取得
  4. 変数data,datanameに渡して連続してプロットする

順番にプロットして動画チックにする(よりシンプルに)

<できたスクリプト>

dofor_get_filename2.gp
outdrct='C:\home\gnuplot\160101\'   #outdrctにrootディレクトリ格納
outdrct2='C:/home/gnuplot/160101/'  #outdrctにrootディレクトリ格納
# cd outdrct.'rawdata/trace'
drctpath=sprintf("%srawdata\\trace",outdrct)    # drctpathに目的のディレクトリ入れる(ココまではつなげてしまっても良い)


command=sprintf('dir %s /b | awk "{print}"',drctpath)   # ファイル名一覧を出力するdir /bしてパイプでawkに渡す
list=system(command)
do for [data in list]{
    dataname=outdrct2.'rawdata/trace/'.data
    p[][-150:0] dataname w l lc "grey40" title data
}

<スクリプト中でやってること>

  1. commandでawkによってファイル一覧を吐き出させるまではほぼ同じ。違うのは1行ずつではなく改行区切りで一気に出力※
  2. awkの出力をlistという変数に格納
  3. list一行一行をdataに代入していくと、さっきと同じ結果になる。

※標準出力に出してみると改行区切りであるが、gnuplot上ではdo for [foo in "bar foobar ..."]で有効なスペース区切りに解釈してくれるらしい。

補足:規則性があるならdo forの中でiとかの変数を引数にdataname決めればいいのですが、「順番には並んでいるけど規則性がない」場合にファイル名を取得してきて連続描画してくれるスクリプトがほしかったのです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1