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)
感谢您的帮助!
怎么样:
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(输出记录分隔符)添加到它打印的字符串的末尾。默认情况下这是一个换行符。