Sắp xếp danh sách các tên miền (FQDN) bắt đầu từ tld và hoạt động bên trái


20

Tôi đang tìm cách sắp xếp danh sách các tên miền (danh sách trắng bộ lọc web) bắt đầu từ TLD và hoạt động trở lên. Tôi đang tìm kiếm bất kỳ công cụ * nix hoặc windows nào có thể thực hiện việc này một cách dễ dàng, mặc dù một tập lệnh cũng sẽ ổn.

Vì vậy, nếu danh sách bạn được đưa ra

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

Đây là những gì tôi muốn là đầu ra.

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

Chỉ trong trường hợp bạn đang tự hỏi tại sao, Squidguard, có một lỗi / lỗi thiết kế. Nếu cả hai www.example.comexample.comcả hai đều được bao gồm trong một danh sách, thì example.commục nhập bị bỏ qua và bạn chỉ có thể truy cập nội dung từ đó www.example.com. Tôi có một vài danh sách lớn cần dọn dẹp vì ai đó đã thêm các mục mà không cần tìm trước.


Không phải các comtên miền xuất hiện trước edutrong danh sách được sắp xếp của bạn?
Sven

9
Yup, tôi thất bại trong việc sắp xếp thủ công, đó là lý do tại sao tôi đang tìm kiếm một công cụ. :)
Zoredache


3
Ngoài ra, phiên bản python có so sánh tốt với phiên bản perl vì sắp xếp của pythons hoạt động trong danh sách danh sách; sắp xếp của perl không và phải được thực hiện.
Đánh dấu Wagner

1
Mặt khác, điều này sẽ khó khăn hơn nhiều nếu OP đã yêu cầu các tên miền hàng đầu theo danh sách hậu tố công khai của Mozilla ( publicsuffix.org ) được xử lý thành một khối. Một lúc nào đó tôi có thể đi xung quanh để làm điều đó (nó sẽ là một điều tốt đẹp cho một dự án), còn ai quan tâm nữa không?
phk

Câu trả lời:


15

Kịch bản python đơn giản này sẽ làm những gì bạn muốn. Trong ví dụ này tôi đặt tên cho tệp 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])

Để chạy nó sử dụng:

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

Lưu ý rằng vẻ bề ngoài này một xấu xí chút kể từ khi tôi viết bài này là nhiều hơn hoặc một lớp lót ít hơn một đơn giản, tôi đã phải sử dụng ký hiệu lát[::-1] nơi các giá trị tiêu cực làm việc để tạo một bản sao của cùng một danh sách theo thứ tự ngược thay vì sử dụng khai báo nhiều reverse()mà thực hiện tại chỗ theo cách phá vỡ khả năng kết hợp.

Và đây là một phiên bản dài hơn một chút, nhưng có thể dễ đọc hơn, sử dụng reversed()trả về một trình vòng lặp, do đó cũng cần phải bọc nó list()để sử dụng trình vòng lặp và tạo ra một danh sách:

#!/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)))

Trên một tệp có 1.500 dòng được sắp xếp ngẫu nhiên, phải mất ~ 0,02 giây:

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

Trên một tệp có 150.000 dòng được sắp xếp ngẫu nhiên, chỉ mất hơn 3 giây:

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

Đây là một phiên bản dễ đọc hơn, có thể đọc reverse()sort()tại chỗ, nhưng nó chạy trong cùng một khoảng thời gian và thực sự chiếm nhiều bộ nhớ hơn một chút.

#!/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)

Trên một tệp có 1.500 dòng được sắp xếp ngẫu nhiên, phải mất ~ 0,02 giây:

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

Trên một tệp có 150.000 dòng được sắp xếp ngẫu nhiên, chỉ mất hơn 3 giây:

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

Tôi thích nhìn thấy nhiều giải pháp. Tôi chấp nhận câu trả lời dựa trên python vì đó là những gì tôi sử dụng cho nhiều tập lệnh khác của mình. Các câu trả lời khác dường như cũng hoạt động.
Zoredache

1
Nếu bất cứ ai quan tâm đến việc sắp xếp theo tên miền trước, hãy bỏ qua TLD, sử dụngdata.sort(key=lambda x: x[1:])
Calimo

9

Đây là tập lệnh PowerShell sẽ làm những gì bạn muốn. Về cơ bản, nó ném tất cả các TLD vào một mảng đảo ngược từng TLD, sắp xếp nó, đảo ngược nó trở lại trật tự ban đầu và sau đó lưu nó vào một tệp khác.

$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

Chạy trên 1.500 hồ sơ - mất 5 giây trên máy tính để bàn khá mạnh.


Nó khá đơn giản để chuyển đổi tập lệnh này thành bash hoặc ngôn ngữ khác mà tôi nghĩ.
Mark Henderson

5 giây dường như là một khoảng thời gian dài chỉ với 1.500 dòng. Việc thực hiện trăn của tôi thực hiện 1.500 trong một phần của giây và 150.000 chỉ trong hơn 3 giây. Bạn cho rằng điều gì làm cho nó quá chậm trong PowerShell?
aculich

Vâng, đó là một thời gian dài. Tôi không biết tại sao nó lại mất nhiều thời gian như vậy. Có lẽ bởi vì powershell không thực sự nhằm mục đích làm những việc như thế này.
Mark Henderson

7

tên miền mèo | vòng quay | sắp xếp | vòng quay


Tôi đoán điều đó sẽ làm việc. Tôi thực sự thích có TLD được sắp xếp, và điều này sẽ không hoàn thành điều đó. Sử dụng điều này, các TLD trong ví dụ của tôi sẽ theo thứ tự (uk, mil, pl, com, edu, gov) Vì đây là một cách đơn giản để sắp xếp bên trái, thay vì các ranh giới miền.
Zoredache

câu trả lời hay nhất tôi từng thấy!
Daniel

1
rev domain.txt|sort|rev
Giàu

6

Ít khó hiểu hơn, hoặc ít nhất là đẹp hơn, Perl:

use warnings;
use strict;

my @lines = <>;
chomp @lines;

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

print "$_\n" for @lines;

Đây là một ví dụ đơn giản về phép biến đổi Guttman, Rosler : chúng tôi chuyển đổi các dòng thành dạng có thể sắp xếp thích hợp (ở đây, chia tên miền theo các dấu chấm và đảo ngược thứ tự của các bộ phận), sắp xếp chúng bằng cách sử dụng sắp xếp từ điển gốc và sau đó chuyển đổi dòng trở lại hình thức ban đầu của họ.


6

Trong kịch bản Unix: đảo ngược, sắp xếp và đảo ngược:

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

Điều tương tự với một vòng lặp duy nhất: awk -F. '{for(i=NF;i>0;i--){printf ".%s",$i};printf "\t%s\n",$0}' file|sort|cut -f2Có thể muốn loại bỏ các máy chủ cục bộ trước tiêngrep \. file | awk ...
Rich

3

Đây là perl (ngắn và khó hiểu):

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

Bạn có thông tin thời gian cho loại này? Tôi tò mò muốn xem cách này so sánh với triển khai PowerShell của @ Mark-Henderson , cũng như việc triển khai Python của tôi . Tôi đã sử dụng /usr/bin/time -vcho thời gian trôi qua và thống kê bộ nhớ tối đa.
aculich

4
Perl hoàn toàn THẮNG lúc obfuscation.
Massimo

4
Mô tả một tập lệnh Perl là "ngắn và khó hiểu" là không cần thiết.
Belmin Fernandez

@aculich, ngoại trừ tập lệnh powershell, tất cả các tùy chọn dường như mất ít hơn 0,1 giây trong tệp của tôi.
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}'

Điều này làm là đảo ngược từng tệp trong tên miền, sắp xếp và đảo ngược lại.

Điều này thực sự sắp xếp danh sách tên miền, theo từ vựng dựa trên từng phần của tên miền, từ phải sang trái.

Giải pháp ngược lại ( rev <<<filename>>> | sort | rev), không, tôi đã thử nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.