Je cherche à trier une liste de noms de domaine (une liste blanche de filtres Web) à partir du TLD et en remontant. Je recherche des outils * nix ou windows qui peuvent le faire facilement, même si un script conviendrait également.
Donc, si c'est la liste qui vous est donnée
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
C'est ce que je veux comme sortie.
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
Juste au cas où vous vous demandez pourquoi Squidguard a un défaut de conception / bug. Si les deux www.example.com
et example.com
sont tous deux inclus dans une liste, l' example.com
entrée est ignorée et vous ne pouvez visiter que le contenu de www.example.com
. J'ai plusieurs grandes listes qui nécessitent un nettoyage, car quelqu'un a ajouté des entrées sans regarder en premier.
com
domaines ne devraient-ils pas apparaître avantedu
dans votre liste triée?Réponses:
Ce simple script python fera ce que vous voulez. Dans cet exemple, je nomme le fichier
domain-sort.py
:Pour l'exécuter, utilisez:
Notez que cela semble un peu plus laid depuis que j'ai écrit cela comme plus ou moins un simple simple, j'ai dû utiliser la notation par tranche d'
[::-1]
où les valeurs négatives fonctionnent pour faire une copie de la même liste dans l'ordre inverse au lieu d'utiliser le plus déclaratifreverse()
qui le fait en place d'une manière qui rompt la composabilité.Et voici une version légèrement plus longue, mais peut-être plus lisible qui utilise
reversed()
qui retourne un itérateur, d'où la nécessité de l'envelopper égalementlist()
pour consommer l'itérateur et produire une liste:Sur un fichier avec 1 500 lignes triées aléatoirement, cela prend ~ 0,02 seconde:
Sur un fichier avec 150 000 lignes triées aléatoirement, cela prend un peu plus de 3 secondes:
Voici une version sans doute plus lisible qui fait le
reverse()
etsort()
en place, mais elle s'exécute dans le même temps et prend en fait un peu plus de mémoire.Sur un fichier avec 1 500 lignes triées aléatoirement, cela prend ~ 0,02 seconde:
Sur un fichier avec 150 000 lignes triées aléatoirement, cela prend un peu plus de 3 secondes:
la source
data.sort(key=lambda x: x[1:])
Voici un script PowerShell qui devrait faire ce que vous voulez. Fondamentalement, il jette tous les TLD dans un tableau inverse chaque TLD, le trie, le ramène à son ordre d'origine, puis l'enregistre dans un autre fichier.
Il a fonctionné sur 1 500 enregistrements - a pris 5 secondes sur un bureau raisonnablement puissant.
la source
cat domain.txt | rev | trier | tour
la source
rev domain.txt|sort|rev
Perl légèrement moins crypté, ou du moins plus joli:
Voici un exemple simple de transformation de Guttman – Rosler : nous convertissons les lignes dans la forme triable appropriée (ici, divisons le nom de domaine par périodes et inversons l'ordre des parties), trions-les en utilisant le tri lexicographique natif, puis convertissons le lignes à leur forme d'origine.
la source
Dans les scripts Unix: inversez, triez et inversez:
la source
awk -F. '{for(i=NF;i>0;i--){printf ".%s",$i};printf "\t%s\n",$0}' file|sort|cut -f2
pourrait vouloir d'abord éliminer les hôtes locaux avecgrep \. file | awk ...
Le voici en (court et cryptique) perl:
la source
/usr/bin/time -v
le temps écoulé et les statistiques de mémoire max.Cela revient à inverser chaque fichier du nom de domaine, à trier et à inverser.
Cela trie vraiment la liste des domaines, lexicographiquement en fonction de chaque partie du nom de domaine, de droite à gauche.
La solution inverse (
rev <<<filename>>> | sort | rev
), non, je l'ai essayée.la source