Estoy tratando de agregar una cadena aleatoria para cada línea mientras se ejecuta:
awk '{print "name" "'$ran'" "-"$0}' 'myfile'
Antes de eso, se genera la cadena aleatoria:
ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
El problema es que imprimirá la misma cadena aleatoria para cada línea:
nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-
¿Qué debo hacer para obtener diferentes cadenas aleatorias para cada línea?
tr -dc '[:alnum:]' </dev/urandom | head -c 6
, sería más simple y computacionalmente más eficiente de usarpwgen -s 6 1
, o mejor aún,pwgen -s 6 $(wc -l myfile)
le dará exactamente todas las cadenas aleatorias que necesita, de una sola vez.Respuestas:
Con función awk
system()
:Muestra
input.txt
:Salida de muestra:
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
fuente
tr: write error: Broken pipe
?¿No crees que es un poco obvio? ¡Solo está generando una cadena aleatoria una vez y la almacena en
ran
variable y la usa para todas las líneas!Utilizando
getline
en una variable de una tuberíaCuando lo usa
command | getline var
, la salida del comando se envía a través de una tubería haciagetline()
y dentro de la variablevar
.También tenga en cuenta que cuando se abre una tubería para salida,
awk
recuerda el comando asociado con él y las escrituras posteriores al comando se agregan a las escrituras anteriores. Necesitamos hacer unaclose()
llamada explícita del comando para evitar eso.Si las comillas simples anidadas en el
str_generator
están causando un problema, reemplace con su equivalente octal (\047
)fuente
Ejecutar una instancia de
tr -dc '[:alnum:]' </dev/urandom | head -c 6
por línea de entrada sería contraproducente, sería mejor hacerlo:Si su entrada no contiene backticks ni comillas simples, también puede usar
m4
'smkstemp()
:fuente
Esta variación en un par de las otras respuestas hace la generación de cadenas aleatorias fuera de
awk
:La canalización
tr
+fold
genera un flujo interminable de cadenas aleatorias de seis caracteres en la entrada estándar deawk
.awk
ignorará la entrada estándar si se proporciona un nombre de archivo, por lo que estas cadenas aleatorias se leengetline
desde/dev/stdin
dentro de la variabler
.printf
luego se usa para prefijar las líneas del archivo con la cadena apropiada.Dado el archivo
esto puede producir
fuente
Sin usar awk en absoluto, simplemente simple
bash
fuente
Requisitos : el input.txt debe contener solo una columna, en otras palabras, no debe tener tabulaciones o espacios, ya que se utilizan como separador predeterminado por
awk
ypaste
(solo caracteres de tabulación) comandos. De lo contrario, el comando debe modificarse un poco.Nota: El alfabeto Base64 contiene
+
y/
caracteres: tabla Base64 , si solo desea números y letras, puede usar elbase32
comando - Alfabeto Base32 .Entrada
===
caracteres añadidos para mayor claridad.Salida
fuente