¿No crees que es un poco obvio? ¡Solo está generando una cadena aleatoria una vez y la almacena en ranvariable y la usa para todas las líneas!
Utilizando getlineen una variable de una tubería
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
Cuando lo usa command | getline var, la salida del comando se envía a través de una tubería hacia getline()y dentro de la variable var.
También tenga en cuenta que cuando se abre una tubería para salida, awkrecuerda el comando asociado con él y las escrituras posteriores al comando se agregan a las escrituras anteriores. Necesitamos hacer una close()llamada explícita del comando para evitar eso.
Si las comillas simples anidadas en el str_generatorestán causando un problema, reemplace con su equivalente octal ( \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
tr -dc '[:alnum:]' </dev/urandom | head -c 6, sería más simple y computacionalmente más eficiente de usarpwgen -s 6 1, o mejor aún,pwgen -s 6 $(wc -l myfile)le dará exactamente todas las cadenas aleatorias que necesita, de una sola vez.