เรียงลำดับรายชื่อโดเมน (FQDNs) เริ่มจาก tld และใช้งานได้


20

ฉันกำลังค้นหาเรียงลำดับรายชื่อโดเมน (รายการที่อนุญาตสำหรับตัวกรองเว็บ) เริ่มต้นจาก 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.comและexample.comรวมอยู่ในรายการรายการนั้นexample.comจะถูกละเว้นและคุณสามารถเยี่ยมชมเนื้อหาwww.example.comได้เท่านั้น ฉันมีรายการขนาดใหญ่หลายรายการที่ต้องมีการล้างข้อมูลเนื่องจากมีบางคนเพิ่มรายการโดยไม่ต้องค้นหาก่อน


comโดเมนไม่ควรปรากฏมาก่อนeduในรายการที่เรียงลำดับของคุณหรือไม่
สเวน

9
ใช่ฉันล้มเหลวในการจัดเรียงด้วยตนเองซึ่งเป็นเหตุผลที่ฉันกำลังมองหาเครื่องมือ :)
Zoredache

1
มีการซ้อนทับของstackoverflow.com/questions/342590/sorting-domain-namesหรือไม่
Mark Wagner

3
นอกจากนี้รุ่นไพ ธ อนก็ดีเมื่อเทียบกับรุ่น perl เพราะการเรียงลำดับของ pythons นั้นใช้ได้กับรายการของรายการ การเรียงลำดับของ Perl ไม่ได้และจะต้องดำเนินการ
Mark Wagner

1
ในหมายเหตุด้านนี้จะเป็นสิ่งที่ท้าทายมากขึ้นถ้า OP ได้ขอโดเมนชั้นนำตามรายการต่อท้ายสาธารณะของ Mozilla ( publicsuffix.org ) ที่จะจัดการเป็นหนึ่งบล็อก ในบางครั้งฉันอาจมาทำมัน (มันจะดีสำหรับโครงการ) ใครสนใจ?
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

ฉันชอบที่จะเห็นวิธีแก้ปัญหามากมาย ฉันยอมรับคำตอบจากหลามเป็นส่วนใหญ่เพราะมันเป็นสิ่งที่ฉันใช้สำหรับสคริปต์อื่น ๆ ของฉัน คำตอบอื่น ๆ ทั้งหมดดูเหมือนจะทำงานด้วย
Zoredache

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 วินาทีบนเดสก์ท็อปที่ทรงพลังพอสมควร


มันควรจะค่อนข้างง่ายในการแปลงสคริปต์นี้เป็นทุบตีหรือภาษาอื่นที่ฉันคิดว่า
มาร์คเฮนเดอร์สัน

5 วินาทีดูเหมือนจะใช้เวลานานเพียง 1,500 บรรทัดเท่านั้น การใช้งานไพ ธ อนของฉันทำได้ 1,500 ในเสี้ยววินาทีและ 150,000 ในเวลาเพียง 3 วินาที คุณคิดว่าอะไรทำให้ PowerShell ช้ามาก?
aculich

ใช่มันเป็นเวลานาน ฉันไม่รู้เลยว่าทำไมมันใช้เวลานานขนาดนั้น อาจเป็นเพราะ PowerShell ไม่ได้มีวัตถุประสงค์เพื่อทำสิ่งนี้
Mark Henderson

7

cat domain.txt | rev | จัดเรียง | การหมุนรอบ


ฉันเดาว่ามันจะใช้ได้ ฉันชอบที่จะมีการเรียงลำดับ TLD และสิ่งนี้จะไม่สำเร็จ การใช้สิ่งนี้ TLDs ในตัวอย่างของฉันจะอยู่ในลำดับ (uk, mil, pl, com, edu, gov) เนื่องจากเป็นการจัดเรียงขวาแบบง่าย ๆ แทนที่จะเป็นขอบเขตโดเมน
Zoredache

คำตอบที่ดีที่สุดที่ฉันเคยเห็น!
แดเนียล

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 scripting: reverse, sort และ reverse:

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

คุณมีข้อมูลเวลาสำหรับการจัดเรียงนี้หรือไม่? ฉันอยากจะเห็นวิธีการนี้จะเปรียบเทียบกับ@ มาร์คเฮนเดอดำเนินการ PowerShellเช่นเดียวกับการดำเนินการหลามของฉัน ฉันใช้/usr/bin/time -vเวลาที่ผ่านไปและสถิติหน่วยความจำสูงสุด
aculich

4
Perl ชนะทั้งหมดที่ทำให้งงงวย
Massimo

4
การอธิบายสคริปต์ Perl ว่า "short and cryptic" นั้นซ้ำซ้อน
Belmin Fernandez

@aculich ยกเว้นสคริปต์ powershell ตัวเลือกทั้งหมดดูเหมือนจะใช้เวลาน้อยกว่า 0.1 วินาทีในไฟล์ของฉัน
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}'

สิ่งนี้ทำคือการย้อนกลับแต่ละยื่นในชื่อโดเมนเรียงลำดับและย้อนกลับ

สิ่งนี้จะเรียงลำดับรายการโดเมนอย่างแท้จริงโดยยึดตามส่วนของชื่อโดเมนจากขวาไปซ้าย

โซลูชันย้อนกลับ ( rev <<<filename>>> | sort | rev) ไม่ฉันได้ลองแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.