web-dev-qa-db-ja.com

ドメイン名(FQDN)のリストをtldから開始して左に並べ替えます

TLDから始めて上に向かって、ドメイン名のリスト(Webフィルターのホワイトリスト)をソートしようとしています。私はこれを簡単に実行できる* nixまたはWindowsツールを探していますが、スクリプトも問題ありません。

だからあなたが与えられたリストであるなら

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

これが出力として必要なものです。

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

Squidguardにバグ/設計上の欠陥がある理由を疑問に思っている場合に備えて。 www.example.comexample.comの両方がリストに含まれている場合、example.comエントリは無視され、www.example.comのコンテンツにのみアクセスできます。誰かが最初に見ずにエントリを追加したため、いくつかの大きなリストをいくつかクリーンアップする必要があります。

23
Zoredache

この単純なpythonスクリプトはあなたが望むことを行います。この例では、ファイルにdomain-sort.pyという名前を付けます:

#!/usr/bin/env python
from fileinput import input
for y in sorted([x.strip().split('.')[::-1] for x in input()]): print '.'.join(y[::-1])

それを実行するには、以下を使用します。

cat file.txt | ./domain-sort.py

私はこれを多かれ少なかれ単純なワンライナーとして使用しなければならなかったので、これは少し醜く見えることに注意してください [::-1]のスライス表記 where負の値は、同じリストを逆の順序でコピーするように機能します代わりに、宣言性のあるreverse()を使用して、構成可能性を損なう方法でインプレースします。

そして、これは少し長くなりますが、イテレータを返すreversed()を使用するより読みやすいバージョンです。したがって、イテレータを使用してリストを生成するために、list()でラップする必要もあります。

#!/usr/bin/env python
from fileinput import input
for y in sorted([list(reversed(x.strip().split('.'))) for x in input()]): print '.'.join(list(reversed(y)))

ランダムにソートされた1,500行のファイルでは、約0.02秒かかります。

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 21632

ランダムにソートされた150,000行のファイルでは、3秒強かかります。

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.20
Maximum resident set size (kbytes): 180128

reverse()sort()を同じ場所で実行する、間違いなく読みやすいバージョンですが、同じ時間で実行され、実際には少し多くのメモリを消費します。

#!/usr/bin/env python
from fileinput import input

data = []
for x in input():
   d = x.strip().split('.')
   d.reverse()
   data.append(d)
data.sort()
for y in data:
   y.reverse()
   print '.'.join(y)

ランダムにソートされた1,500行のファイルでは、約0.02秒かかります。

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 22096

ランダムにソートされた150,000行のファイルでは、3秒強かかります。

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.08
Maximum resident set size (kbytes): 219152
17
aculich

これは、必要な処理を実行するPowerShellスクリプトです。基本的には、すべてのTLDを配列にスローし、各TLDを逆にし、並べ替え、元の順序に戻し、別のファイルに保存します。

$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

それを1,500レコードで実行しました-かなり強力なデスクトップで5秒かかりました。

10
Mark Henderson

cat domain.txt | rev |並べ替え|回転

8
user3721740

Unixスクリプトの場合:逆、並べ替え、逆:

awk -F "." '{for(i=NF; i > 1; i--) printf "%s.", $i; print $1}' file |
  sort |
  awk -F "." '{for(i=NF; i > 1; i--) printf "%s.", $i; print $1}'
6
jfg956

少し不可解な、または少なくともきれいなPerl:

use warnings;
use strict;

my @lines = <>;
chomp @lines;

@lines =
    map { join ".", reverse split /\./ }
    sort
    map { join ".", reverse split /\./ }
    @lines;

print "$_\n" for @lines;

これは Guttman–Rosler変換 の簡単な例です:行を適切な並べ替え可能な形式に変換します(ここでは、ドメイン名をピリオドで分割し、パーツの順序を逆にします)。ネイティブの辞書式ソートを行ってから、行を元の形式に変換します。

6
Ilmari Karonen

ここではそれは(短くて不可解な)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" }
3
Mark Wagner
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}'

これは、ドメイン名に提出された各ファイルを逆にして、並べ替えて逆に戻すことです。

これにより、ドメインリストがドメイン名の各部分に基づいて辞書順に、右から左に並べ替えられます。

逆のソリューション(rev <<<filename>>> | sort | rev)、しない、私はそれを試しました。

0
Mike Rudra