Ви не вважаєте, що це трохи очевидно? Ви просто генеруєте випадкову рядок один раз і зберігаєте її в 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_generatorc викликають проблему, замініть його восьмеричним еквівалентом ( \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)- ви отримаєте саме всі випадкові рядки, які вам потрібні, за один кадр.