我正在尝试使用 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(输出记录分隔符)添加到其打印的字符串末尾。默认情况下这是一个换行符。