从查找表分配值的 Shell 脚本太慢

从查找表分配值的 Shell 脚本太慢

我正在尝试使用 shell 脚本从查找文件中分配一些变量。
我有一些工作,但似乎没有必要慢。

脚本:

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

使用额外的进程(即每次都 fork awk)会大大减慢速度。read将读取多个字段,以空格分隔$IFS(默认值全部为空格)。列出的最后一个变量将接收该行的其余部分(如果有)。

我只是想知道$message应该从哪里来。也许在代码片段之外?

编辑:如果代码部分仅在输入中出现一次,那么break一旦找到它,您就可以退出循环;这也会加快速度。

答案2

可以使用 awk 来完成整个事情。
awk 也比循环快得多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,与 print 结合使用来打印 OFS(输出字段分隔符),默认情况下为 space

除非另有指定,否则默认情况下代码将在文件的每一行上运行。

print 命令会将 ORS(输出记录分隔符)添加到其打印的字符串末尾。默认情况下这是一个换行符。

相关内容