Estou procurando classificar uma lista de nomes de domínio (uma lista de permissões de filtro da Web) começando no TLD e trabalhando para cima. Estou procurando qualquer ferramenta * nix ou windows que possa fazer isso facilmente, embora um script também esteja bom.
Então, se esta é a lista que você recebe
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
É isso que eu quero como saída.
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
Caso você esteja se perguntando por que, Squidguard, tem uma falha de design / bug. Se ambos www.example.com
e ambos example.com
estiverem incluídos em uma lista, a example.com
entrada será ignorada e você poderá acessar apenas o conteúdo de www.example.com
. Eu tenho várias listas grandes que precisam de limpeza porque alguém adicionou entradas sem olhar primeiro.
com
domínios não deveriam aparecer antesedu
na sua lista classificada?Respostas:
Este script python simples fará o que você deseja. Neste exemplo, nomeio o arquivo
domain-sort.py
:Para executá-lo, use:
Observe que isso parece um pouco mais feio, porque eu escrevi isso como uma linha simples, mais ou menos simples. Eu tive que usar a notação de fatia de
[::-1]
onde valores negativos funcionam para fazer uma cópia da mesma lista na ordem inversa, em vez de usar o mais declarativoreverse()
que fá-lo no lugar de uma maneira que quebre a composição.E aqui está uma versão um pouco mais longa, mas talvez mais legível que usa o
reversed()
que retorna um iterador, daí a necessidade de envolvê-lolist()
para consumir o iterador e produzir uma lista:Em um arquivo com 1.500 linhas classificadas aleatoriamente, leva ~ 0,02 segundos:
Em um arquivo com 150.000 linhas classificadas aleatoriamente, leva um pouco mais de 3 segundos:
Aqui está uma versão discutivelmente mais legível que funciona
reverse()
esort()
no local, mas é executada na mesma quantidade de tempo e, na verdade, requer um pouco mais de memória.Em um arquivo com 1.500 linhas classificadas aleatoriamente, leva ~ 0,02 segundos:
Em um arquivo com 150.000 linhas classificadas aleatoriamente, leva um pouco mais de 3 segundos:
fonte
data.sort(key=lambda x: x[1:])
Aqui está um script do PowerShell que deve fazer o que você deseja. Basicamente, ele lança todos os TLDs em uma matriz, inverte cada TLD, classifica-o, inverte-o de volta à sua ordem original e o salva em outro arquivo.
Executou 1.500 registros - levou 5 segundos em um desktop razoavelmente poderoso.
fonte
gato domain.txt | rev | classificar | rev
fonte
rev domain.txt|sort|rev
Um pouco menos enigmático, ou pelo menos mais bonito, Perl:
Este é um exemplo simples de uma transformação de Guttman-Rosler : convertemos as linhas no formato classificável apropriado (aqui, dividimos o nome do domínio em períodos e invertemos a ordem das partes), classificá-las usando a classificação lexicográfica nativa e depois convertemos o linhas de volta à sua forma original.
fonte
Nos scripts Unix: reverse, sort e reverse:
fonte
awk -F. '{for(i=NF;i>0;i--){printf ".%s",$i};printf "\t%s\n",$0}' file|sort|cut -f2
Pode querer retirar anfitriões locais primeiro comgrep \. file | awk ...
Aqui está o perl (curto e enigmático):
fonte
/usr/bin/time -v
o tempo decorrido e as estatísticas máximas de memória.O que isso faz é reverter cada arquivo no nome de domínio, classificar e retroceder.
Isso realmente classifica a lista de domínios, lexicograficamente com base em cada parte do nome do domínio, da direita para a esquerda.
A solução reversa (
rev <<<filename>>> | sort | rev
), não, eu tentei.fonte