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の各列からデータを取得する方法はありますか?
ありがとう。
「-」は、データが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」のみを含む行で終了する必要があります。
私は、データを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
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回書き込みます。
区切り記号を設定する代わりにsed
を介してパイプすることにより、csvファイルをスペースで区切られた(複数の行にまたがるレコードがないと仮定して)変換を試みます。
cat test | sed 's/,/ /g' | gnuplot -p -e "plot '-' using ..."
多分これは古い質問ですが、他の回答に基づいて興味深い解決策を見つけました:
cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a - -
出力は次のようになります。
"contents of filename"
e
"contents of filename"
e
"contents of filename"
e
これでcat
とawk
は通常どおり機能しますが、ユーティリティtee
を使用すると、前のコマンドからパイプされた標準出力をファイルにコピーできますが、このファイルはbestdin自体なので、n回-
後-a
。
オプション -i
は、コピー中の信号による割り込みを停止します。-a
は、上書きせずに標準入力に入力を追加し、全体をstdoutに書き込むように指示します。
参考のために Tee Utility を見てください。
「-」を追加してもうまくいかなかったため、次のことを行う必要がありました。
cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a /dev/stdout /dev/stdout
私にとってこれは私がするときにうまくいきます:
set datafile separator ','
plot "test.csv" using 1:2 with lines
データファイルの区切り文字に「、」ではなく「、」を使用したようです
gnuplotはランダムアクセス(つまり、stdinではない)を必要とするようですので、
# explicitly open "test" file
$ gnuplot -p -e "set datafile separator \",\"; plot 'test' using 1:2 with lines, '' using 1:3 with lines;"