/ / Hosts-Datei nach TLD-Domain sortieren, nicht nach Suffix (.com.whatever) oder Präfix (Subdomains) - Perl, Sortierung, Unix, Terminal

Sortieren der Hosts-Datei nach TLD-Domain, nicht nach Suffix (.com.whatever) oder Präfix (Subdomains) - Perl, Sortierung, Unix, Terminal

Ich muss eine sehr große Liste mit Half-Mil-Einträgen von Domain-Namen in einer Host-Datei sortieren. Aber ich möchte sie nicht nach Subdomains oder nach .com .net sortieren.

Also das:

www.apple3.com
this.apple4.com
that.apple1.uk
and.that.apple2.com.br

Daraus wird Folgendes werden:

that.apple1.uk
and.that.apple2.com.br
www.apple3.com
this.apple4.com

Noch kein IPS auf dieser Liste (da alle auf 0.0.0.0 aufgelöst werden, werde ich das später hinzufügen), nur die Domänen sind in der Liste. Ich benutze einen Mac mit Brew, daher kann ich jedes GNU- oder Nix-Tool für verwenden es. Danke im Voraus!

Antworten:

3 für die Antwort № 1

Der Schlüssel zu einer effizienten Sortierung in Perl besteht darin, eine Funktion zu erstellen, die den zu sortierenden Wert in eine repräsentative Zeichenfolge umwandelt, die lexikografisch sortiert werden kann.

Wenn Sie beispielsweise Datumsangaben sortieren möchten, können Sie sie in die yyyymmdd Format. In diesem Fall ordnen wir die Teile der Domain so um, dass

foo.bar.apple1.co.uk

wird zu einer der folgenden:

# Using this approach, the sorted order of apple1.com and apple1.net will vary.
apple1.bar.foo

32

# Using this approach, the sorted order of apple1.com and apple1.net will be consistent.
apple1.bar.foo<NUL>uk.co

Wir möchten, dass die Zahlen auf natürliche Weise sortiert werden (1, 2, 10 statt 1, 10, 2). Unsere Schlüsselfunktion könnte damit umgehen, aber wir werden den einfachen Ausweg durch Ersetzen finden sort mit natkeysort von Sortieren :: Schlüssel :: Natürlich. Als Bonus natkeysort ermöglicht uns die einfache Integration unserer Schlüsselfunktion!

Der schwierige Teil ist, das Suffix zu identifizieren. Es gibt keine Regel dafür, nur ständig wechselnde Definitionen. Daher verwenden wir ein Modul, um das Suffix zu identifizieren.


Implementierung der Tastenfunktion mit Domain :: PublicSuffix:

use feature qw( state );

use Domain::PublicSuffix qw( );

sub get_sort_key {
my ($host) = @_;
$host =~ s/.z//;
state $dps = Domain::PublicSuffix->new();
$dps->get_root_domain($host)
or die "$host: ".$dps->error();

my @name   = split /./, substr($host, 0, -length($dps->suffix())-1);
my @suffix = split /./, $dps->suffix();
return join(".", reverse @name)."".join(".", reverse @suffix);
}

Implementierung der Tastenfunktion mit IO :: Socket :: SSL :: PublicSuffix:

use feature qw( state );

use IO::Socket::SSL::PublicSuffix qw( );

sub get_sort_key {
my ($host) = @_;
my @host = split(/./, $host);
state $ps = IO::Socket::SSL::PublicSuffix->default();
my ($name, $suffix) = $ps->public_suffix(@host);
return join(".", reverse @$name)."".join(".", reverse @$suffix);
}

Die obigen Funktionen werden wie folgt verwendet:

use feature qw( say );

use Sort::Key::Natural qw( natkeysort );

my @hosts = (
"www.apple3.net",
"www.apple3.com",
"this.apple4.com",
"that.apple4.com",
"www.apple10.com",
"that.apple1.uk",
"and.that.apple2.com.br",
);

my @sorted_hosts = natkeysort { get_sort_key($_) } @hosts;

say for @sorted_hosts;

Ausgabe:

that.apple1.uk
and.that.apple2.com.br
www.apple3.com
www.apple3.net
that.apple4.com
this.apple4.com
www.apple10.com

IO :: Socket :: SSL :: PublicSuffix wird angeblich öfter aktualisiert als Domain :: PublicSuffix (und Mozilla :: PublicSuffix), aber es ist Teil einer größeren Distribution.