Estou tentando adicionar uma string aleatória para cada linha durante a execução:
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
Antes disso, a string aleatória é gerada:
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
O problema é que ele imprimirá a mesma string aleatória para cada linha:
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
O que devo fazer para obter uma string aleatória diferente para cada linha?
Você não acha que é meio óbvio? Você está apenas gerando uma string aleatória uma vez e armazenando-a na
ran
variável e usando-a para todas as linhas!Usando
getline
em uma variável de um pipeQuando você usa
command | getline var
, a saída do comando é enviada por meio de um canal paragetline()
a variávelvar
.Observe também quando um canal é aberto para saída,
awk
lembra o comando associado a ele e as gravações subsequentes no comando são anexadas às gravações anteriores. Precisamos fazer umaclose()
chamada explícita do comando para evitar isso.Se as aspas simples aninhadas
str_generator
estiverem causando um problema, substitua por seu equivalente octal (\047
)Com função awk
system()
:Amostra
input.txt
:Exemplo de saída:
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
Executar uma instância de
tr -dc '[:alnum:]' </dev/urandom | head -c 6
por linha de entrada seria contraproducente, seria melhor fazer:Se sua entrada não contiver backticks nem aspas simples, você também pode usar
m4
'smkstemp()
:Essa variação em algumas das outras respostas faz a geração aleatória de strings fora de
awk
:O pipeline
tr
+fold
gera um fluxo infinito de strings aleatórias de seis caracteres na entrada padrão deawk
.awk
irá ignorar a entrada padrão se um nome de arquivo for fornecido, então essas strings aleatórias são lidasgetline
na/dev/stdin
variávelr
.printf
é então usado para prefixar as linhas do arquivo com a string apropriada.Dado o arquivo
isso pode produzir
Sem usar awk, apenas simples
bash
Requisitos - o input.txt deve conter apenas uma coluna, ou seja, não deve conter tabulações ou espaços, pois utilizam como separador padrão os comandos
awk
epaste
(somente caractere de tabulação). Caso contrário, o comando deve ser modificado um pouco.Nota: O alfabeto Base64 contém
+
e/
caracteres: Tabela Base64 , se você quiser apenas números e letras, pode usarbase32
o comando - Alfabeto Base32 .Entrada
===
caracteres adicionados para maior clareza.Resultado