ルックアップテーブルから値を割り当てるシェルスクリプトが遅すぎる

ルックアップテーブルから値を割り当てるシェルスクリプトが遅すぎる

ルックアップファイルからいくつかの変数を割り当てるためにシェルスクリプトを使用しようとしています。
仕事が少しありますが、不必要に遅いと思います。

スクリプト:

while read line           
    do           
        code=`echo $line | awk -F' ' '{print $1}'`;
        device=`echo $line | awk -F' ' '{print $2}'`;
        state=`echo $line | awk -F' ' '{print $3}'`;
        if  [[ $code == $message ]]
            then
                echo "Translated: $device-$state";
        fi
done <CODE-LIST.txt

コードリスト.txt:

MQTT-CODE   DEVICE  STATE
1-1-32-16236607 RGB_LED ON
1-1-32-16203967 RGB_LED OFF

これを行うより速い方法がありますか? (おそらくawkまたはsed)
助けてくれてありがとう!

答え1

どうですか?

while read code device state junk; do
    if [[ $code == $message ]]; then
        echo "Translated: $device-$state"
    fi
done <CODE-LIST.txt

追加のプロセス(毎回awk分岐)を使用すると、作業速度が大幅に遅くなります。read複数のフィールドをスペースで区切って読み込みます$IFS(デフォルトはすべて空白です)。リストされた最後の変数は行の残りの部分を受け取ります(存在する場合)。

$message私はそれがどこから来たのか知りたいです。たぶんコードの部分の外にあるのでしょうか?

編集:コードセクションが入力に一度だけ表示される場合は、breakループを見つけてループを終了すると作業速度が速くなります。

答え2

すべての操作はawkを使用して実行できます。
awkはloopingよりはるかに高速ですwhile read

awk -vM="$Message" '$1==M{print "Translated:",$2"-"$3}' CODE-LIST.txt

説明する

    -vM="$Message" - Create a variable named M with the value from $Message

     $1==M         - If the first field is equal to variable M($Message)

     {print "Translated:",$2"-"$3} - Write Translated and the second and third fields

     CODE-LIST.txt - The file being read

コードに関する追加コメント

Aは、デフォルト,では、空白の出力フィールド区切り記号(OFS)を印刷するために印刷と共に使用されます

特に指定しない限り、デフォルトではコードはファイルの各行で実行されます。

print コマンドは、印刷する文字列の末尾に ORS (Output Record Separator) を追加します。デフォルトではこれは改行文字です。

関連情報