Você não acha que isso é óbvio? Você está apenas gerando uma sequência aleatória uma vez e armazenando-a em ran
variável e usando-a para todas as linhas!
Usando getline
em uma variável de um pipe
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
Quando você usa command | getline var
, a saída do comando é enviada através de um canal para getline()
a variável var
.
Observe também quando um canal é aberto para saída, awk
lembra o comando associado a ele e as gravações subseqüentes no comando são anexadas às gravações anteriores. Precisamos fazer uma close()
chamada explícita do comando para evitar isso.
Se as aspas simples aninhadas no str_generator
estão causando um problema, substitua pelo seu 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
, seria mais simples e mais eficiente em termos de computaçãopwgen -s 6 1
, ou melhor aindapwgen -s 6 $(wc -l myfile)
, fornecerá exatamente todas as seqüências aleatórias necessárias, de uma só vez.