我试图在运行时为每一行添加随机字符串:
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
Run Code Online (Sandbox Code Playgroud)
在此之前,生成随机字符串:
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
Run Code Online (Sandbox Code Playgroud)
问题是它会为每一行打印相同的随机字符串:
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能为每行获得不同的随机字符串?
你不觉得这有点明显吗?您只需生成一次随机字符串并将其存储在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
Run Code Online (Sandbox Code Playgroud)
当您使用时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
Run Code Online (Sandbox Code Playgroud)
使用awk system()
功能:
样品input.txt
:
a
b
c
Run Code Online (Sandbox Code Playgroud)
awk '{
printf "name";
system("tr -dc \047[:alnum:]\047 </dev/urandom | head -c6");
printf "-%s\n", $0
}' input.txt
Run Code Online (Sandbox Code Playgroud)
示例输出:
nameSDbQ7T-a
nameAliHY0-b
nameDUGP2S-c
Run Code Online (Sandbox Code Playgroud)
system(command)
执行操作系统命令command
然后返回awk程序
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
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}'
Run Code Online (Sandbox Code Playgroud)
如果您的输入不包含反引号或单引号,您还可以使用m4
's mkstemp()
:
<input sed "s/.*/mkstemp(name)\`&'/" | m4
Run Code Online (Sandbox Code Playgroud)
其他几个答案的这种变化会在以下范围之外生成随机字符串awk
:
LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6 |
awk '{ getline r <"/dev/stdin"; printf("name%s-%s\n", r, $0) }' file
Run Code Online (Sandbox Code Playgroud)
tr
+管道fold
在 的标准输入上生成无限的随机六字符字符串流awk
。 如果提供了文件名,将忽略标准输入,因此这些随机字符串由fromawk
读取到变量中。 然后使用适当的字符串为文件中的行添加前缀。getline
/dev/stdin
r
printf
给定文件
123
abc
@#$
Run Code Online (Sandbox Code Playgroud)
这可能会产生
nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$
Run Code Online (Sandbox Code Playgroud)