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

Dav*_*vid 3 linux sed awk string shell-script

我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

代码列表.txt:

MQTT-CODE   DEVICE  STATE
1-1-32-16236607 RGB_LED ON
1-1-32-16203967 RGB_LED OFF
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法来做到这一点?(也许是 awk 或 sed)
感谢您的帮助!

wur*_*tel 6

怎么样:

while read code device state junk; do
    if [[ $code == $message ]]; then
        echo "Translated: $device-$state"
    fi
done <CODE-LIST.txt
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 6

可以将 awk 用于整个过程。
awk 也比while read循环快得多。

awk -vM="$Message" '$1==M{print "Translated:",$2"-"$3}' CODE-LIST.txt
Run Code Online (Sandbox Code Playgroud)

解释

    -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
Run Code Online (Sandbox Code Playgroud)

关于代码的更多说明

A,与 print 结合使用以打印默认为空格的 OFS(输出字段分隔符)

除非另有说明,否则默认情况下代码将在文件的每一行上运行。
.
打印命令会将 ORS(输出记录分隔符)添加到它打印的字符串的末尾。默认情况下这是一个换行符。