Je cherche à trier une liste de noms de domaine (une blancheur de filtre Web) à partir du TLD et de travailler vers le haut. Je cherche des outils * Nix ou Windows pouvant le faire facilement, bien qu'un script irait aussi aussi.
Donc, si la liste est la liste que vous recevez
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 la 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 bogue/de conception. Si les deux www.example.com
et example.com
sont tous deux inclus dans une liste, puis le example.com
L'entrée est ignorée et vous ne pouvez visiter que le contenu de www.example.com
. J'ai plusieurs grandes listes qui ont besoin d'un certain nettoyage parce que quelqu'un a ajouté des entrées sans avoir l'air d'abord.
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 renverse dans son ordre d'origine, puis l'enregistre dans un autre fichier.
$TLDs = Get-Content .\TLDsToSort-In.txt
$TLDStrings = @();
foreach ($TLD in $TLDs){
$split = $TLD.split(".")
[array]::Reverse($split)
$TLDStrings += ,$split
}
$TLDStrings = $TLDStrings|Sort-Object
foreach ($TLD in $TLDStrings){[array]::Reverse($TLD)}
$TLDStrings | %{[string]::join('.', $_)} | Out-File .\TLDsToSort-Out.txt
Ran It sur 1 500 enregistrements - a pris 5 secondes sur un bureau raisonnablement puissant.
Ici, c'est dans (court et cryptique) Perl:
#!/usr/bin/Perl -w
@d = <>; chomp @d;
for (@d) { $rd{$_} = [ reverse split /\./ ] }
for $d (sort { for $i (0..$#{$rd{$a}}) {
$i > $#{$rd{$b}} and return 1;
$rd{$a}[$i] cmp $rd{$b}[$i] or next;
return $rd{$a}[$i] cmp $rd{$b}[$i];
} } @d) { print "$d\n" }
awk -F"." 's="";{for(i=NF;i>0;i--) {if (i<NF) s=s "." $i; else s=$i}; print s}' <<<filename>>> | sort | awk -F"." 's="";{for(i=NF;i>0;i--) {if (i<NF) s=s "." $i; else s=$i}; print s}'
Ce que cela fait est d'inverser chaque fichier dans le nom de domaine, de trier et de retourner en arrière.
Ceci trie vraiment la liste de domaines, basé sur une base lexicographique sur chaque partie du nom de domaine, de droite à gauche.
La solution inverse (rev <<<filename>>> | sort | rev
), ne le fait pas, je l'ai essayé.