我有一个如下所示的文本文件:
1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad
我试图循环遍历这个文件,然后 make 1923.12.312.
variable1
,Nikl
variable2
然后在 echo 命令中使用它们。然后它应该继续并制作12391.123.123
variable1
和Jo
variable2
回显这些等等。
到目前为止,这就是我所做的:
while read p
do
variable1="$(awk '{print $1}')"
variable2="$(awk '{print $2}')"
echo "if [ \"\$STATUS\" == \"$variable1\" ]
then
vem=\"$variable2\"
fi"
done saker.txt
这应该输出:
if [ "$STATUS" == "1923.12.312." ]
then
vem="NIKL"
fi
等等,但事实并非如此,相反,这是输出
awk: cmd. line:1: {print $2)
awk: cmd. line:1: ^ syntax error
if [ "STATUS" == "12391.123.123
12398123.123912" ]
then
vem=""
fi
我还尝试放弃变量并这样做:
while read p
do
echo "if [ \"\$STATUS\" == \"`awk '{print $1}'`\" ]
then
vem=\"`awk '{print $2}'`\"
fi"
done saker.txt
但它产生了相同的结果。
答案1
使用外壳
如果我们使用 read 的能力将行分成变量,那就很容易了:
while read var1 var2
do
echo "if [ \"\$status\" == \"$var1\" ]
then
vem=\"$var2\"
fi"
done <saker.txt
这会产生:
if [ "$status" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$status" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$status" == "12398123.123912" ]
then
vem="Ad"
fi
使用 awk:
此 awk 命令使用单个printf
命令:
$ awk '{printf "if [ \"$status\" == \"%s\" ]\nthen\nvem=\"%s\"\nfi\n",$1,$2}' saker.txt
if [ "$status" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$status" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$status" == "12398123.123912" ]
then
vem="Ad"
fi
答案2
我强烈怀疑您根本不应该运行脚本来更新脚本。相反,您应该awk
从原始脚本中调用,并以这种方式获取所需的数据。然后saker.txt
可以简单地用作配置文件(确实如此)来更改脚本的行为(而不是使用它来更改脚本制作脚本的输出)。
显然,我对您的脚本的数据非常有限,但看起来您正在使用saker.txt
查找表来在脚本中设置变量。
具体来说,脚本片段:
if [ "$STATUS" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$STATUS" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$STATUS" == "12398123.123912" ]
then
vem="Ad"
fi
可以使用内联 awk 脚本进行功能复制,如下所示:
vem=$( awk -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )
这回答了“如何bash
根据在文件中查找另一个变量的值来设置变量?”这似乎是您试图通过运行脚本来更新脚本来完成的任务。
当然,也有一些警告,例如“如果 的值根本$STATUS
没有列出怎么办?” saker.txt
“如果它被列出两次怎么办?” “如何设置默认值vem
?”但您仍然需要注意所有这些问题,而且还有脚本更新脚本。
vem
编辑:如果您想在文件中给定的值中允许空格saker.txt
,最好使用其他内容作为分隔符,例如制表符:
$ cat saker.txt
1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad
然后使用以下版本的awk
单行代码:
vem=$( awk -Ft -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )
关于制表符分隔符的警告:确保不使用超过一个标签。与 的默认“空格分隔”处理不同awk
,当您显式地将分隔符仅设置为 TAB 时,每个无论制表符之间是否有任何文本,制表符都被视为分隔符。因此10000<tab><tab>John
将被视为三个字段:“10000”、“”(空字段)和“John”。