¿Cómo puedo reemplazar aleatoriamente cadenas específicas en un archivo de texto con cadenas de otro archivo? Por ejemplo:
file1.txt(file has more than 200 lines):
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
file2.txt(file has 10-20 lines):
@adress1.com
@adress2.com
@adress3.com
@adress4.com
@adress5.com
output.txt:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
command-line
text-processing
elanozturk
fuente
fuente
Respuestas:
Si realmente desea una selección aleatoria, entonces aquí hay una manera de usar
awk
:OTOH si quieres una permutación aleatoria de las direcciones, te sugiero algo como
fuente
paste
pero no se me ocurrió usarlocut
para eliminar el campo no coincidente.<(sort -R file2.txt)
usar algo como<(yes "$(<file2.txt)" | head -n $(wc -l < file1.txt) | sort -R)
eso, eso puede sesgar la aleatoriedad a favor de líneas más cercanas a la parte superior del archivo2.Podría implementar este algoritmo:
file2.txt
en una matrizfile1.txt
:Me gusta esto:
(Un agradecimiento especial a @GlennJackman y @dessert por las mejoras).
fuente
mapfile -t addresses < file2.txt
: el usocat
como ese lo somete a división de palabras y expansión de nombre de archivo.file1.txt
si este archivo no termina con una línea vacía (lo siento, no puedo probar en este momento)? Si no lo recomiendowhile IFS='' read -r orig || [[ -n "$orig" ]]; do
, vea Leer un archivo línea por línea asignando el valor a una variable · SO .Puede usar
shuf
(puede que necesitesudo apt install shuf
) para mezclar las líneas del segundo archivo y luego usarlas para reemplazar:shuf
simplemente aleatoriza el orden de sus líneas de entrada. Elawk
comando allí primero leerá todo el archivo1 (NR==FNR
solo será verdadero mientras se lee el primer archivo) y guardará el segundo campo (los campos están definidos por@
, por lo que este es el dominio) en la matriz asociativaa
cuyos valores son los dominios y cuyas claves son los números de línea. Luego, cuando lleguemos al siguiente archivo, simplemente imprimirá lo que esté almacenadoa
para este número de línea, junto con lo que está en el archivo 2 para el mismo número de línea.Tenga en cuenta que esto supone que ambos archivos tienen exactamente el mismo número de líneas y que en realidad no son "aleatorios", ya que no permitirá que se repita nada. Pero eso se parece a lo que querías pedir.
fuente
Python 2.7 y 3 solución
Esta solución reemplaza la primera aparición de una sola cadena arbitraria dada (la "aguja") en cada línea del archivo de entrada con una cadena cada vez elegida al azar del conjunto de líneas de la lista de cadenas de reemplazos.
Debería ser casi trivial anclar la aguja al principio o al final de la cuerda o usar expresiones regulares por completo.
Uso
Ejemplo:
o
fuente
Aquí hay una manera perl:
fuente
Otra solución bash. Utiliza la función de reemplazo de cadena incorporada bash. También supone que
file2.txt
contiene solo las cadenas de reemplazo. Si no, se pueden filtrar primero usandogrep -o <replace> file2.txt
Con
shuf
Sin
shuf
(casi purobash
)Aquí tenemos que crear primero una función que imite
shuf
asíEntonces es similar
Prueba:
fuente