2

だから私はいくつかの迅速かつ汚い解決策を探しています。

問題:

gnuplot を使用して、データ ファイルの特定のセクションをプロットしようとしています。これで問題ありません。基本的な行は次のようになります

plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:log($4**2+$5**2) notitle

これはうまくいきます。次のステップは、データの別の部分、つまりデータ エントリ $3 をタイトルに含めることです (リストされているポイントは同一であるため、どこからでも解析できます)。プロットは問題ないように見えますが、正規表現情報を「タイトル」にフィードできないように見えるため、問題が発生します。うまくいかない例」

plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:log($4**2+$5**2) title "<(sed -n '1,1p' pointsandstuff.dat)"

(これは理論的にはデータ行全体を吐き出しますが、実際には "<(sed...") というタイトルを取得するだけです)

これを bash スクリプトで攻撃しようとしましたが、使用する「$」が bash スクリプトを混乱させます。

#!/bin/bash


STRING=$(echo|sed -n '25001,25001p' pointsandstuff.dat)
echo $STRING


 gnuplot -persist << EOF
 set xrange[:] noreverse nowriteback
 set yrange[:] noreverse nowriteback

 eval "plot "<(sed -n '25001,30000p' pointsandstuff.dat)" u 1:log($4**2+$5**2) title $STRING


EOF

Bash は '$4' と '$5' をどうするかわかりません。

4

3 に答える 3

2

プロセス置換を試みているようですが、最初のケースでは二重引用符が機能しなくなり、2 番目のケースではコマンド置換が必要です。

あなたが持っている:

plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:log($4**2+$5**2) \
      title "<(sed -n '1,1p' pointsandstuff.dat)"

必要なもの:

plot <(sed -n '1,100p' pointsandstuff.dat) u 1:log($4**2+$5**2) \
      title "$(sed -n '1,1p' pointsandstuff.dat)"

2 番目のケースの二重引用符は厳密には必要ないかもしれませんが、存在しても問題ありません。

  • プロセス置換はファイル名を生成し、ネストされたコマンドの出力をそのファイルにフィードします。コマンドは、ファイルを読み取っていると見なします (ファイルを読み取っているため)。

  • コマンド置換は、ネストされたコマンドの出力を文字列にキャプチャし、その文字列をコマンドに渡します (ここのようにコマンドの引数として使用される場合)。

于 2012-09-01T00:03:16.277 に答える
1

質問に対する私の理解は少し曖昧ですが、最初の100行をプロットしたいようです-これは非常に簡単です:

plot '< head -100 datafile.dat' u  ....

もちろん、必要sedに応じて(awkまたは...)使用できます。gnuplot のみのソリューションは次のようになります。

plot 'datafile.dat' u ($0 > 100? 1/0:$1):(log($4**2+$5**2))

または、次のように (通常の選択ではより単純です):

plot 'datafile.dat' every ::25001::30000 u 1:(log($4**2+$5**2)

別の回答で詳しく説明しています。

ここで、タイトルをデータファイルから取得したい場合は、gnuplot の を使用して解析できますbacktic substitution

plot ... title "`head -1 datafile.dat | awk '{print $3}'`"

これは基本的に gnuplot のシステム コマンドと同じです。

plot ... title system("head -1 datafile.dat | awk '{print $3}'")

ただし、この場合、関数を使用できる場合があります。columnhead

plot ... title columnhead(3)
于 2012-09-02T15:50:52.830 に答える
0

ああ、みんなありがとう。今までにいくつかの解決策を思いつきました-最も簡単なのは、以前からそれらの $s をエスケープすることです(gnuplotが嫌いだと誤って思っていました...)。具体的には:

STRING=$(echo|sed -n '1,1p' spointsandstuff.dat)
echo $STRING


 gnuplot -persist << EOF
 set xrange[:] noreverse nowriteback
 set yrange[:] noreverse nowriteback

 eval "plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:(log(\$4**2+\$5**2)) title '$STRING'
 !gv diag_spec.eps &

EOF

とはいえ、どうもありがとうございました。これは、このようなもので遊ぶための良い口実でした...貧しい魂が後でこのスクリプトを見た場合、彼らにとって少し楽になるかもしれないことを願っています.

于 2012-09-03T13:39:41.760 に答える