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