Тебе не кажется, что это немного очевидно? Вы просто генерируете случайную строку один раз, сохраняете ее в 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
tr -dc '[:alnum:]' </dev/urandom | head -c 6, он будет проще и вычислительнее эффективнее в использованииpwgen -s 6 1, а еще лучшеpwgen -s 6 $(wc -l myfile), даст вам все нужные вам случайные строки за один выстрел.