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.com
とexample.com
の両方がリストに含まれている場合、example.com
エントリは無視され、www.example.com
のコンテンツにのみアクセスできます。誰かが最初に見ずにエントリを追加したため、いくつかの大きなリストをいくつかクリーンアップする必要があります。
この単純な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
これは、必要な処理を実行する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秒かかりました。
cat domain.txt | rev |並べ替え|回転
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}'
少し不可解な、または少なくともきれいな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変換 の簡単な例です:行を適切な並べ替え可能な形式に変換します(ここでは、ドメイン名をピリオドで分割し、パーツの順序を逆にします)。ネイティブの辞書式ソートを行ってから、行を元の形式に変換します。
ここではそれは(短くて不可解な)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}'
これは、ドメイン名に提出された各ファイルを逆にして、並べ替えて逆に戻すことです。
これにより、ドメインリストがドメイン名の各部分に基づいて辞書順に、右から左に並べ替えられます。
逆のソリューション(rev <<<filename>>> | sort | rev
)、しない、私はそれを試しました。