Você não acha que isso é óbvio? Você está apenas gerando uma sequência aleatória uma vez e armazenando-a em ranvariável e usando-a para todas as linhas!
Usando getlineem 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, awklembra 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_generatorestã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.