Estou tentando adicionar uma seqüência aleatória para cada linha durante a execução:
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
Antes disso, a sequência aleatória é gerada:
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
O problema é que ele imprimirá a mesma sequência aleatória para cada linha:
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
O que devo fazer para obter uma sequência aleatória diferente para cada linha?
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.Respostas:
Com a função awk
system()
:Amostra
input.txt
:Saída de amostra:
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
fonte
tr: write error: Broken pipe
?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 pipeQuando você usa
command | getline var
, a saída do comando é enviada através 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 subseqüentes 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 no
str_generator
estão causando um problema, substitua pelo seu equivalente octal (\047
)fonte
A execução de uma instância de
tr -dc '[:alnum:]' </dev/urandom | head -c 6
cada linha de entrada seria contraproducente, seria melhor:Se sua entrada não contiver reticulares nem aspas simples, você também poderá usar
m4
'smkstemp()
:fonte
Essa variação em algumas das outras respostas gera a geração aleatória de cadeias fora de
awk
:O pipeline
tr
+fold
gera um fluxo interminável de seqüências aleatórias de seis caracteres na entrada padrão deawk
.awk
ignorará o padrão de entrada se um nome de ficheiro é fornecido, de modo que essas cadeias aleatórias são lidosgetline
pela partir de/dev/stdin
dentro da variávelr
.printf
é então usado para prefixar as linhas do arquivo com a sequência apropriada.Dado o arquivo
isso pode produzir
fonte
Sem usar o awk, é simples
bash
fonte
Exigências - o input.txt deve conter apenas uma coluna, ou seja, não deve ter tabulações ou espaços, porque eles foram usados como separador padrão por
awk
epaste
(apenas 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ê deseja apenas números e letras, pode usar obase32
comando - alfabeto Base32 .Entrada
===
caracteres adicionados para maior clareza.Resultado
fonte