ルックアップファイルからいくつかの変数を割り当てるためにシェルスクリプトを使用しようとしています。
仕事が少しありますが、不必要に遅いと思います。
スクリプト:
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) を追加します。デフォルトではこれは改行文字です。