AWKを使用してシェルで変数を定義する

AWKを使用してシェルで変数を定義する

ライブ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に渡したいと思います。変数を作成するためにそれらをリンクします。$4MNR$machine_numberMID$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"

これが双方向に渡されたパラメータを明確にしてください。

おすすめ記事