Estoy buscando ordenar una lista de nombres de dominio (una lista blanca de filtro web) comenzando desde el TLD y trabajando hacia arriba. Estoy buscando herramientas * nix o windows que puedan hacer esto fácilmente, aunque un script también estaría bien.
Entonces, si es la lista que se te da
www.activityvillage.co.uk
ajax.googleapis.com
akhet.co.uk
alchemy.l8r.pl
au.af.mil
bbc.co.uk
bensguide.gpo.gov
chrome.angrybirds.com
cms.hss.gov
crl.godaddy.com
digitalhistory.uh.edu
digital.library.okstate.edu
digital.olivesoftware.com
Esto es lo que quiero como salida.
chrome.angrybirds.com
crl.godaddy.com
ajax.googleapis.com
digital.olivesoftware.com
digital.library.okstate.edu
digitalhistory.uh.edu
bensguide.gpo.gov
cms.hss.gov
au.af.mil
alchemy.l8r.pl
www.activityvillage.co.uk
akhet.co.uk
bbc.co.uk
En caso de que se pregunte por qué, Squidguard, tiene un error / falla de diseño. Si ambos www.example.com
y ambos example.com
están incluidos en una lista, la example.com
entrada se ignora y solo puede visitar el contenido www.example.com
. Tengo varias listas grandes que necesitan limpieza porque alguien agregó entradas sin mirar primero.
com
aparecer los dominios antesedu
en su lista ordenada?Respuestas:
Este simple script de Python hará lo que quieras. En este ejemplo, nombro el archivo
domain-sort.py
:Para ejecutarlo use:
Tenga en cuenta que esto se ve un poco más feo, ya que escribí esto como más o menos una línea simple. Tuve que usar la notación de corte de
[::-1]
dónde funcionan los valores negativos para hacer una copia de la misma lista en orden inverso en lugar de usar el más declarativoreverse()
que lo hace en el lugar de una manera que rompe la componibilidad.Y aquí hay una versión un poco más larga, pero tal vez más legible, que utiliza la
reversed()
que devuelve un iterador, de ahí la necesidad de envolverlalist()
para consumir el iterador y producir una lista:En un archivo con 1,500 líneas ordenadas al azar, toma ~ 0.02 segundos:
En un archivo con 150,000 líneas ordenadas al azar, toma un poco más de 3 segundos:
Aquí hay una versión posiblemente más legible que hace
reverse()
ysort()
en el lugar, pero se ejecuta en la misma cantidad de tiempo, y en realidad toma un poco más de memoria.En un archivo con 1,500 líneas ordenadas al azar, toma ~ 0.02 segundos:
En un archivo con 150,000 líneas ordenadas al azar, toma un poco más de 3 segundos:
fuente
data.sort(key=lambda x: x[1:])
Aquí hay un script de PowerShell que debe hacer lo que quieras. Básicamente, arroja todos los TLD en una matriz, invierte cada TLD, lo ordena, lo revierte a su orden original y luego lo guarda en otro archivo.
Lo ejecutó en 1,500 registros: tomó 5 segundos en un escritorio razonablemente potente.
fuente
cat domain.txt | rev | ordenar | Rvdo
fuente
rev domain.txt|sort|rev
Un poco menos críptico, o al menos más bonito, Perl:
Este es un ejemplo simple de una transformación de Guttman-Rosler : convertimos las líneas en la forma ordenable apropiada (aquí, dividimos el nombre de dominio en puntos y revertimos el orden de las partes), las ordenamos usando el orden lexicográfico nativo y luego convertimos el líneas de regreso a su forma original.
fuente
En Unix scripting: reverse, sort y reverse:
fuente
awk -F. '{for(i=NF;i>0;i--){printf ".%s",$i};printf "\t%s\n",$0}' file|sort|cut -f2
puede querer eliminar primero a los hosts locales congrep \. file | awk ...
Aquí está en perl (corto y críptico):
fuente
/usr/bin/time -v
el tiempo transcurrido y las estadísticas de memoria máxima.Lo que esto hace es revertir cada archivo en el nombre de dominio, ordenar y revertir.
Esto realmente ordena la lista de dominios, lexicográficamente basada en cada parte del nombre de dominio, de derecha a izquierda.
La solución inversa (
rev <<<filename>>> | sort | rev
) no, lo he intentado.fuente