如何为每一行添加随机字符串?

如何为每一行添加随机字符串?

我试图在运行时为每一行添加随机字符串:

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

相关内容