web-dev-qa-db-ja.com

gnuplot stdin、2つの線をプロットする方法?

Stdinから取得したデータを使用して、2行のプロットを作成しようとしています。 「test.csv」というファイルがあります。

0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6

私はこれを次のようなコマンドでプロットしようとしています:

$ cat test | gnuplot -p -e "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;"

しかし、何を試しても、

line 5: warning: Skipping data file with no valid points

これは、2行目のstdinがすでに使い果たされているためだと思います。 gnuplotが異なるプロットのstdinの各列からデータを取得する方法はありますか?

ありがとう。

26
Steve

「-」は、データがplotコマンドの後に続くことを指定するために使用されます。したがって、それを使用する場合は、次のようなことを行う必要があります。

echo "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;" | cat - datafile.dat | gnuplot -p

(おそらく上記の引用はエスケープする必要があります)。

あなたが探しているのはこれです:

plot '< cat -'

今、あなたは行うことができます:

cat test | sed ... | gnuplot -p "plot '< cat -' using ..."

以下のように、plotでオプションを使用している場合は、stdinを介して入力データを複数回フィードする必要があることに注意してください。

cat testfile testfile | gnuplot -p "plot '< cat -' using 1, '' using 2"

上記の場合、testfileは、文字「e」のみを含む行で終了する必要があります。

マニュアル参照

15
PonyEars

私は、データを2回送信することによってこれを回避することができ、各ブロックの後の独自の行でam "e"で終了しました。したがって、入力は次のようになります。

set datafile separator ","; plot '-' using 1:2 with lines, '' using 1:3 with lines
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e
10
bdew

Gnuplotはstdinから読み取ることができますが、各プロットステートメントに対して、新しいデータセットが必要です。以下は正常に動作します:

cat test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l"

2番目のプロットコマンドに, '' using 1:3を追加するとすぐにエラーが表示されます。この場合、最初のデータセットは再利用のために内部に保存されないため、データを再度送信する必要があります。したがって、2つのプロットコマンドの場合、次のスニペットが適切に機能します。

echo 'e' | cat test.csv - test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l, '' using 1:3 w l"

これは、最初のプロットコマンドのデータの終わりを示すeで区切られた、データファイルを2回書き込みます。

7
Christoph

区切り記号を設定する代わりにsedを介してパイプすることにより、csvファイルをスペースで区切られた(複数の行にまたがるレコードがないと仮定して)変換を試みます。

cat test | sed 's/,/ /g' | gnuplot -p -e "plot '-' using ..."
2
arnsholt

多分これは古い質問ですが、他の回答に基づいて興味深い解決策を見つけました:

cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a - -

出力は次のようになります。

"contents of filename"
e
"contents of filename"
e
"contents of filename"
e

これでcatawkは通常どおり機能しますが、ユーティリティteeを使用すると、前のコマンドからパイプされた標準出力をファイルにコピーできますが、このファイルはbestdin自体なので、n--a

オプション -iは、コピー中の信号による割り込みを停止します。-aは、上書きせずに標準入力に入力を追加し、全体をstdoutに書き込むように指示します。

参考のために Tee Utility を見てください。

1
robotik

「-」を追加してもうまくいかなかったため、次のことを行う必要がありました。

 cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a /dev/stdout /dev/stdout 
0
LEo

試しましたか グラフ ?あなたのケースは次のように簡単です:

cat test | chart line ','

そしてあなたに与えるでしょう:

line chart

0
mlg

私にとってこれは私がするときにうまくいきます:

set datafile separator ','
plot "test.csv" using 1:2 with lines

データファイルの区切り文字に「、」ではなく「、」を使用したようです

0
Martin

gnuplotはランダムアクセス(つまり、stdinではない)を必要とするようですので、

# explicitly open "test" file
$ gnuplot -p -e "set datafile separator \",\"; plot 'test' using 1:2 with lines, '' using 1:3 with lines;"
0