web-dev-qa-db-ja.com

gnuplot:データファイルの最初の行を無視する最短の方法

別のサードパーティアプリケーションによって作成された.csvデータファイルがあり、gnuplotを使用してプロットする必要があります。ファイルが次の形式であると仮定しましょう。

1;2;3;4;5;6 <-- This is the header line that should be ignored (with values 1;2;...;N)
1;1;2;1;1;1
2;3;3;3;5;6
3;4;1;1;1;4

最初の列はx軸で、次の列はそれぞれ独自のラインプロットとしてプロットする必要があります(はい、1つのプロット内のラインプロットが多すぎると、見た目が悪くなるかもしれませんが、単に考えをつかむためです)。ここにMCVE:

set terminal png size 1000,500    
set datafile separator ";" # CSV file is seperated with ;
plot \
  'C://tmp/test.csv' using 1:2 with lines title "A",\
  'C://tmp/test.csv' using 1:3 with lines title "B",\
  'C://tmp/test.csv' using 1:4 with lines title "C",\
  'C://tmp/test.csv' using 1:5 with lines title "D",\
  'C://tmp/test.csv' using 1:6 with lines title "E"

問題は、これがデータであるように最初の行もプロットすることです。

#のような#1;2;3;4;5;6でデータファイルを開始することでデータファイルの行を無視できることは知っていますが、他のツールでも使用されているため、ファイルを編集したくありません。

別の方法は、plot <filename> every ::1を使用して最初の行を無視することです。つまり、このスクリプトで説明されているように 、上記のスクリプトにevery ::1を5回含める必要がありますリンク 。これは次のようになります。

set terminal png size 1000,500    
set datafile separator ";" # CSV file is seperated with ;
plot \
  'C://tmp/test.csv' every ::1 using 1:2 with lines title "A",\
  'C://tmp/test.csv' every ::1 using 1:3 with lines title "B",\
  'C://tmp/test.csv' every ::1 using 1:4 with lines title "C",\
  'C://tmp/test.csv' every ::1 using 1:5 with lines title "D",\
  'C://tmp/test.csv' every ::1 using 1:6 with lines title "E"

すべてのプロットに対してevery ::1を定義することが本当に唯一の方法ですか?最初の(n)行を無視するためのいくつかの短い-望ましいワンライナーがありますか? every ::1を「グローバルに」または(擬似コード)set datafile ignorefirstnlines 1のようなものを定義する方法

15
Markus Weninger

Gnuplotは最初の行から列名を読み取ることができますが、通常どおり列名を指定することもできます。したがって、これは事実上最初の行をスキップします。

コマンドを発行する

_set key autotitle columnhead
_

これはgnuplotに、最初の行はデータではなく、キーに使用される列名であることを伝えます。以前と同じように_unset key_または_plot datafile title sometitle_を引き続き使用でき、gnuplotはそのデータを使用しません。

私のファイルが次のようになっているとします

_1 2
4 5
7 8
_

_set key autotitle columnhead_に続いて_unset key_を発行するだけで(キーが本当に必要ない場合)、最初の行をスキップします。

enter image description here


あるいは、外部プログラムを介してデータをパイプすることもできます。たとえば、awk(Windowsを含むほとんどのOSで利用可能)を使用して、次のことができます。

_plot "< awk '(NR>2){print;}' datafile"
_

最初の2行をスキップするには(Windowsを使用して、'< awk "(NR>2){print;}" datafile'を実行する必要があります)。これを入力し続けたくない場合は、文字列に保存できます

_skipfile = "\"< awk '(NR>2){print;}' datafile\""
_

マクロとして使用します(Windowsの場合は、skipfile = '"< awk \"(NR>2){print;}\" datafile"'を使用します)。たとえば、線を使用してデータファイルをプロットするには、次のようにします

_plot @skipfile with lines
_

_@skipfile_は、単にskipfileの内容を入力したようにコマンドを処理するようにgnuplotに指示します。

30
Matthew