*ファイルを使わずにbash変数(数値データリスト)をgnuplotに渡す方法*

*ファイルを使わずにbash変数(数値データリスト)をgnuplotに渡す方法*

私はgnuplotでプロットしたい一連の点を取得するためにnetcatを使用しています。しかし、最初にファイルに書き込まずにデータをgnuplotに渡すのに問題があります。

最も簡単な場合は、まず次のように変数で定義された3点線を描きたいと思います。

#!/bin/bash

DATA="10
12
15"

echo "$DATA"

# Data looks good in terminal (single vertical column of numbers 10, 12, 15)
# However, the following step doesn't work:

gnuplot -persist <<-EOFMarker
    plot $DATA w lines
EOFMarker

実際のユースケースは、ネットワークで接続されたRigolオシロスコープからデータを取得してグラフ化することです。これまでの完全なスクリプトは次のとおりです。

#!/bin/bash
SERVER=192.168.0.12
PORT=5555

RIGOLDATA="$(echo ":TRAC:DATA? TRACE1" | netcat -q1 $SERVER $PORT | cut -c 13- | tr ',' '\n' | tr -d [:blank:])"
echo "$RIGOLDATA"

# RigolData looks good in terminal (single vertical column of numbers).
# However, the following does not work:

gnuplot -persist <<-EOFMarker
    plot $RIGOLDATA w lines
EOFMarker

次のように、最初にデータを一時ファイルに渡すと、目的の結果が得られますが、一時ファイルを使用しないようにします。

#!/bin/bash
SERVER=192.168.0.12
PORT=5555

RIGOLDATA="$(echo ":TRAC:DATA? TRACE1" | netcat -q1 $SERVER $PORT | cut -c 13- | tr ',' '\n' | tr -d [:blank:])"

echo "$RIGOLDATA" > tempfile.csv


gnuplot -persist <<-EOFMarker
    plot "tempfile.csv" w lines
EOFMarker

ベストアンサー1

plot $DATA w lines

次に展開

plot 10
12
15 w lines

つまり、$DATA含まれているすべての項目は文字通りそこに配置されます(改行文字など)。これによりコマンドが中断される可能性があります。 (gnuplotにコマンドラインから直接データを提供する方法があるかどうかはわかりませんが、plot他の形式が必要な場合があります。)

シェルにはコマンド出力を「ファイル」にインポートしてファイル名に拡張するプロセス置換機能がありますが、stdinを介してデータを渡し、コマンドをオプションplotとして提供することをお勧めします。gnuplot

使用されるコマンド例に基づいてここ、次のように動作します。

echo "$DATA" | gnuplot -e 'plot "-" w lines'

または、まずシェルからデータを収集せずに、データをインポートした場所から直接データを転送します。

echo ":TRAC:DATA? TRACE1" | netcat -q1 "$SERVER" "$PORT" | 
  cut -c 13- | tr ',' '\n' | tr -d "[:blank:]" |
  gnuplot -e 'plot "-" w lines'

もしそうなら、一時ファイルを使用することはそれほど悪くないと思います。多くのシェルスクリプトはそれを使用し、非シェルプログラムもそれを使用します。通常、シェルスクリプトから呼び出される多くのプログラムはファイルを直接読み取ることができますが、シェル変数からデータを渡すにはより複雑でなければなりません。 (たとえば、パイプはecho "$var" | somecmdデータを書き込むために追加のシェルコピーを実行する必要がありますが、ここのドキュメントとここの文字列はバックsomecmd <<< "$var"グラウンドで一時ファイルを生成できます...)

もちろん、通常、作業が終わったら、すべての一時ファイルを削除したいと考え、競合が発生しないように、そのファイルが一意の名前で作成されていることを確認する必要があります。しかし、これは難しくありません:

#!/bin/bash
server=192.168.0.12
port=5555
tempfile=$(mktemp)

echo ":TRAC:DATA? TRACE1" | netcat -q1 "$server" "$port" |
   cut -c 13- | tr ',' '\n' | tr -d "[:blank:]" > "$tempfile"


gnuplot -persist <<-EOFMarker
    plot "$tempfile" w lines
EOFMarker

rm -f -- "$tempfile"

おすすめ記事