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


20

ドメイン名のリスト(Webフィルターホワイトリスト)をTLDから始めて上に向かって並べ替えたいと考えています。私は、これを簡単に行うことができる* 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。誰かが最初に見ずにエントリを追加したため、クリーンアップが必要な大きなリストがいくつかあります。


ソートされたリストにcom以前eduにドメインが表示されるべきではありませんか?
スヴェン

9
うん、手動ソートに失敗したので、ツールを探しています。:)
ゾレダチェ


3
また、pythonsのソートはリストのリストで機能するため、perlバージョンに比べてPythonバージョンが優れています。perlのソートは実装されていないため、実装する必要がありました。
マークワーグナー

1
一方、OPがMozillaのパブリックサフィックス(publicsuffix.org)リストに従ってトップドメインを1ブロックとして処理するように要求した場合、これははるかに困難になります。ある時点でそれをやろうと思うかもしれませんが(プロジェクトにとってはうれしいことです)、他に興味がある人はいますか?
phk

回答:


15

このシンプルな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]どこ逆の順序で負の値が同じリストのコピーを作成する作業を代わりにより宣言を使用して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

たくさんのソリューションを見るのが好きでした。私が他の多くのスクリプトに使用するものであるため、私は主にPythonベースの回答を受け入れています。他の答えもすべてうまくいくようです。
ゾレダチェ

1
TLDを無視して、ドメイン名で並べ替えることに関心がある人は、次を使用してくださいdata.sort(key=lambda x: x[1:])
Calimo

9

これは、必要な処理を実行する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秒かかりました。


このスクリプトをbashまたは他の言語に変換するのはかなり簡単なはずです。
マークヘンダーソン

わずか1,500行の場合、5秒は長い時間のようです。私のpython実装は、ほんの数秒で1,500、3秒強で150,000を実行します。PowerShellで何がそんなに遅くなると思いますか?
-aculich

ええ、長い時間です。なぜそんなに時間がかかるのかわかりません。たぶん、PowerShellはこのようなことを本当に目指していないからです。
マークヘンダーソン

7

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


私はそれがうまくいくと思います。ただし、TLDを並べ替えるのは好きですが、これではそれができません。これを使用すると、私の例のTLDは順序(uk、mil、pl、com、edu、gov)になります。これは、ドメイン境界ではなく、単純な右から左への並べ替えであるためです。
ゾレダチェ

私が見た最高の答え!
ダニエル

1
rev domain.txt|sort|rev
リッチ

6

少しわかりにくい、または少なくともきれいな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

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}'

単一のループで同様のこと:awk -F. '{for(i=NF;i>0;i--){printf ".%s",$i};printf "\t%s\n",$0}' file|sort|cut -f2最初にローカルホストを削除したい場合がありますgrep \. file | awk ...
リッチ

3

これは(短くて不可解な)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" }

この種のタイミング情報はありますか?これが@ Mark-HendersonのPowerShell実装、およびPython実装とどのように比較されるのか興味があります。/usr/bin/time -v経過時間と最大メモリ統計に使用しました。
-aculich

4
Perlは難読化で完全に勝ちます。
マッシモ

4
Perlスクリプトを「短くて不可解な」ものとして記述することは冗長です。
ベルミンフェルナンデス

@aculichは、powershellスクリプトを除いて、すべてのオプションが私のファイルで0.1秒もかからないようです。
ゾレダチェ

0
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)はしません、私はそれを試しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.