ライブMQTTストリームをフィルタリングしてCSVファイルにダンプしました。 CSVファイルの4番目のパラメータ($4
)と5番目のパラメータ()を使用して、必要$5
な情報を見つけます。私はこの情報をawk(例えば、$machine_ID
および$machine_number
)に提供し、私が定義したパラメータで最新のデータを見つけます。コードは次のとおりです。
engine_hours=`awk -F, -v MID="$machine_ID" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/jacon_mqtt.csv`
engine_hours
$machine_ID
に対応するテーブルを更新するためにMySQLを介して送信されます$machine_number
。したがって、デフォルトでは、どのコンピュータを更新するかを選択します。
これで、その値を$5
それぞれorとorに渡したいと思います。変数を作成するためにそれらをリンクします。$4
MNR
$machine_number
MID
$machine_ID
$machine_name
したがって、コードは次のようになります。
engine_hours=`awk -F, '( MID = $4 ) && ( MNR = $5 ) && ( $7 == "status" ) -v "$machine_ID"=MID -v "$machine_number"=MNR {t=$10} END{print int(t/60)}' /home/ed/start_up_job/jacon_mqtt.csv`
私が得るエラーは次のとおりです。awk: line 1: syntax error at or near =
この問題をどのように解決できますか?
ベストアンサー1
通常、awkで計算または抽出された変数をシェルに渡すには、次のエンコードパターンに従う必要があります。
shell_var=$( awk '{ ...some processing... ; print awk_var }' )
変数が複数ある場合に行うことができます。
eval "$( awk '{ ...some processing... ; print "shell_var1="awk_var1, "shell_var2="awk_var2 }' )"
コード説明:シェルモードは、var=$( awk '...' )
awkプロセスが印刷するすべてをシェル変数に割り当てます。 1つの値しか割り当てることができないため、これは2つ以上の変数を割り当てるために異なるアプローチが必要であることを意味します。 1つの方法は、awkにジョブ全体を印刷させることです。たとえば、awk '{ print "varname=" value }'
シェル設定は、$( ... )
awk呼び出しの出力(この場合は割り当て)を含むように再拡張されます。拡張割り当てシェルコマンドを有効にするには、これを実行するコマンドであるeval
シェルディレクティブが必要です。最初の(簡単な)ケースとの違いは、awkに複数のeval
ジョブを一度に印刷するように指示できることです(スペースで区切られています)。
入出力変数といくつかの計算を含む例を見てみましょう。
number=42
square=$( awk -v NUM="$number" 'BEGIN{ print NUM*NUM }' )
echo "$square"
これが双方向に渡されたパラメータを明確にしてください。