Tld ile başlayan ve soldan çalışan alan adları (FQDN'ler) listesini sıralayın


20

TLD'den başlayıp yukarı doğru çalışan bir alan adı listesi (bir web filtresi beyaz listesi) sıralamak istiyorum. Ben de bir komut dosyası çok iyi olsa da, bunu kolayca yapabilirsiniz herhangi bir * nix veya windows araçları arıyorum.

Yani size verilen liste ise

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

Çıktı olarak istediğim bu.

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'ın neden bir hata / tasarım hatası olduğunu merak ediyorsanız. Her ikisi de www.example.comve example.comher ikisi de bir listeye dahil edilmişse , example.comgiriş yok sayılır ve yalnızca içeriği ziyaret edebilirsiniz www.example.com. Birisi ilk bakmadan girişler ekledi çünkü bazı temizlik gerektiren birkaç büyük listeleri var.


Olmamalı cometki huzuruna edusenin sıralı listede?
Sven

9
Evet, manuel sıralamada başarısız oldum, bu yüzden bir araç arıyorum. :)
Zoredache


3
Ayrıca, python sürümü perl sürümüne göre güzel çünkü pythons 'ın sıralama listelerinde çalışıyor; perl'in türü yok ve uygulanmalıydı.
Mark Wagner

1
Bir yan not, OP'nin Mozilla'nın genel son eki ( publicsuffix.org ) listesine göre bir üst blok olarak ele alınmasını istemiş olsaydı, bu çok daha zor olurdu . Bir noktada bunu yapmak için gelebilirim (bir proje için güzel olurdu), ilgilenen herkes?
phk

Yanıtlar:


15

Bu basit python betiği istediğinizi yapar. Bu örnekte dosyayı adlandırıyorum 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])

Çalıştırmak için şunu kullanın:

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

Not bu biraz daha çirkin daha bu yazdım ya beri bu görünüyor ben kullanmak zorunda kaldı daha az basit tek liner dilim gösterimi[::-1] nerede ters sırada aynı listenin bir kopyasını yapmak için negatif değerler çalışmak yerine daha bildirim kullanarak reverse()hangi yerinde çalışabilirliği bozacak şekilde yapar.

Ve burada biraz daha uzun, ama belki de reversed()bir yineleyici döndüren daha okunabilir bir sürüm , bu nedenle list()yineleyiciyi tüketmek ve bir liste üretmek için de sarılması gerekir :

#!/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 rastgele sıralı çizgi içeren bir dosyada ~ 0.02 saniye sürer:

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

150.000 rasgele sıralanmış çizgiye sahip bir dosyada 3 saniyeden biraz fazla sürer:

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

İşte yapar muhtemelen daha okunabilir sürümüdür reverse()ve sort()yerinde, ancak aynı sürede çalışır ve aslında biraz daha fazla bellek alır.

#!/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 rastgele sıralı çizgi içeren bir dosyada ~ 0.02 saniye sürer:

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

150.000 rasgele sıralanmış çizgiye sahip bir dosyada 3 saniyeden biraz fazla sürer:

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

Çok sayıda çözüm görmeyi sevdim. Ben çoğunlukla python tabanlı cevap kabul ediyorum çünkü diğer komutlarımın çoğu için kullandığım şey bu. Diğer cevapların hepsi de işe yarıyor gibi görünüyor.
Zoredache

1
Birisi önce alan adına göre sıralama yapmak, data.sort(key=lambda x: x[1:])
TLD'yi yok saymakla ilgileniyorsa

9

İşte istediğinizi yapmanız gereken bir PowerShell betiği. Temelde tüm TLD'leri bir diziye atar, her TLD'yi tersine çevirir, sıralar, orijinal sırasına geri döndürür ve daha sonra başka bir dosyaya kaydeder.

$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 kayıtta yayınladı - oldukça güçlü bir masaüstünde 5 saniye sürdü.


Bu komut dosyasını bash veya sanırım başka bir dile dönüştürmek oldukça basit olmalı.
Mark Henderson

5 saniye sadece 1.500 satır için uzun bir zaman gibi görünüyor. Python uygulamam saniyenin bir kısmında 1.500, 3 saniyenin üzerinde 150.000 yapıyor. PowerShell'de neyi bu kadar yavaşlattığını düşünüyorsunuz?
aculich

Evet, uzun zaman oldu. Neden bu kadar uzun sürdüğü hakkında hiçbir fikrim yok. Muhtemelen powershell gerçekten böyle şeyler yapmayı amaçlamıyor.
Mark Henderson

7

cat domain.txt | rev | sıralama | devir


Sanırım bu işe yarar. TLD'nin de sıralanmasını isterim ve bu bunu başaramaz. Bunu kullanarak, örneğimdeki TLD'ler sırayla olurdu (uk, mil, pl, com, edu, gov) Çünkü alan sınırları yerine basit bir sağdan sola sıralamadır.
Zoredache

gördüğüm en iyi cevap!
Daniel

1
rev domain.txt|sort|rev
Zengin

6

Biraz daha az şifreli veya en azından daha güzel Perl:

use warnings;
use strict;

my @lines = <>;
chomp @lines;

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

print "$_\n" for @lines;

Bu, bir Guttman-Rosler dönüşümünün basit bir örneğidir : satırları uygun sıralanabilir forma dönüştürüyoruz (burada, alan adını dönemlere ayırıyoruz ve parçaların sırasını tersine çeviriyoruz), yerel sözlükbilimsel sıralamayı kullanarak sıralıyoruz ve ardından satırları orijinal biçimlerine geri döndürür.


6

Unix komut dosyasında: ters, sırala ve ters çevir:

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

Tek bir döngü ile benzer şey: awk -F. '{for(i=NF;i>0;i--){printf ".%s",$i};printf "\t%s\n",$0}' file|sort|cut -f2İlk önce yerel ana bilgisayarları çıkarmak isteyebilirsinizgrep \. file | awk ...
Zengin

3

İşte (kısa ve şifreli) perl'de:

#!/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" }

Bu tür için zamanlama bilginiz var mı? Bunun @ Mark-Henderson'ın PowerShell uygulamasının yanı sıra Python uygulamamla nasıl karşılaştırıldığını merak ediyorum . Kullandığım /usr/bin/time -vgeçen süre ve maksimum bellek istatistikleri için.
aculich

4
Perl şaşkınlıkla tamamen kazanır.
Massimo

4
Perl betiğini "kısa ve şifreli" olarak tanımlamak gereksizdir.
Belmin Fernandez

@aculich, powershell betiği hariç, tüm seçenekler dosyamda 0,1 saniyeden daha kısa sürüyor.
Zoredache

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

Bunun yaptığı, alan adındaki her bir dosyayı tersine çevirmek, sıralamak ve geri çevirmektir.

Bu, alan adının listesini, soyadı adının her bir parçasına dayalı olarak, sağdan sola doğru, gerçekten sıralar.

Ters çözüm ( rev <<<filename>>> | sort | rev), denemedim, denedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.