我试图在运行时为每一行添加随机字符串:
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
在此之前,生成随机字符串:
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
问题是它会为每一行打印相同的随机字符串:
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
我应该怎么做才能为每一行获得不同的随机字符串?
答案1
你不觉得这有点明显吗?您只需生成一次随机字符串并将其存储在ran
变量中并将其用于所有行!
使用getline
管道中的变量
awk '{
str_generator = "tr -dc '[:alnum:]' </dev/urandom | head -c 6"
str_generator | getline random_str
close(str_generator)
print "name " random_str " - " $0
}' file
使用时command | getline var
,命令的输出通过管道发送getline()
到变量var
。
另请注意,当打开管道进行输出时,awk
会记住与其关联的命令,并且对该命令的后续写入将附加到先前的写入中。我们需要显式close()
调用该命令来防止这种情况发生。
如果 中的嵌套单引号str_generator
引起问题,请替换为其八进制等效项 ( \047
)
awk '{
str_generator = "tr -dc \047[:alnum:]\047 </dev/urandom | head -c 6"
str_generator | getline random_str
close(str_generator)
print "name " random_str " - " $0
}' file
答案2
和awk system()
功能:
样本input.txt
:
a
b
c
awk '{
printf "name";
system("tr -dc \047[:alnum:]\047 </dev/urandom | head -c6");
printf "-%s\n", $0
}' input.txt
示例输出:
nameSDbQ7T-a
nameAliHY0-b
nameDUGP2S-c
system(command)
执行操作系统命令command
,然后返回到awk程序
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
答案3
每行输入运行一个实例tr -dc '[:alnum:]' </dev/urandom | head -c 6
会适得其反,你最好这样做:
<input awk -v rng="LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6" '
{rng | getline r; print "name"r"-"$0}'
答案4
根本不使用awk,很简单bash
while read line; do
printf "name%s-%s\n" \
"$(tr -dc '[:alnum:]' </dev/urandom|head -c6)" \
"$line"
done <myfile