循环遍历文件并使每个单词成为变量?

循环遍历文件并使每个单词成为变量?

我有一个如下所示的文本文件:

1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad

我试图循环遍历这个文件,然后 make 1923.12.312. variable1Nikl variable2然后在 echo 命令中使用它们。然后它应该继续并制作12391.123.123 variable1Jo 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”。

相关内容