Тебе не кажется, что это немного очевидно? Вы просто генерируете случайную строку один раз, сохраняете ее в 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)
, даст вам все нужные вам случайные строки за один выстрел.