首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从tld开始对域名列表(FQDNs)进行排序,然后向左工作

从tld开始对域名列表(FQDNs)进行排序,然后向左工作
EN

Server Fault用户
提问于 2012-02-28 01:47:07
回答 5查看 10.1K关注 0票数 29

我正在寻找排序的域名列表(一个网页过滤器白名单)从TLD和工作向上。我正在寻找任何*nix或windows工具,可以很容易地做到这一点,虽然脚本也会很好。

所以如果你得到的是这个列表

代码语言:javascript
运行
复制
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

这就是我想要的输出。

代码语言:javascript
运行
复制
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

以防你想知道为什么,Squid卫兵,有一个错误/设计缺陷。如果www.example.comexample.com都包含在列表中,则忽略example.com条目,您只能从www.example.com访问内容。我有几个大的列表,需要一些清理,因为有人添加了条目,而不是先看。

EN

回答 5

Server Fault用户

回答已采纳

发布于 2012-02-28 08:01:42

这个简单的python脚本可以满足您的需要。在本例中,我将文件命名为domain-sort.py

代码语言:javascript
运行
复制
#!/usr/bin/env python
from fileinput import input
for y in sorted([x.strip().split('.')[::-1] for x in input()]): print('.'.join(y[::-1]))

要运行它,请使用:

代码语言:javascript
运行
复制
cat file.txt | ./domain-sort.py

注意,这看起来有点难看,因为我把它写成一个简单的一行,我不得不使用切片符号[::-1],其中负值工作,以相反的顺序复制相同的列表,而不是使用更具声明性的reverse(),它以破坏可组合性的方式就地执行。

这里有一个稍微长一些的版本,但可能更易读,它使用reversed()返回迭代器,因此也需要将它包装在list()中,以使用迭代器并生成列表:

代码语言:javascript
运行
复制
#!/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))))

对于一个有1500行随机排序的文件,大约需要0.02秒:

代码语言:javascript
运行
复制
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 21632

对于一个有15万行随机排序的文件,它需要3秒多一点:

代码语言:javascript
运行
复制
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.20
Maximum resident set size (kbytes): 180128

这里有一个可读性更强的版本,可以就地执行reverse()sort(),但是它运行的时间相同,实际上占用的内存稍微多一点。

代码语言:javascript
运行
复制
#!/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))

对于一个有1500行随机排序的文件,大约需要0.02秒:

代码语言:javascript
运行
复制
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 22096

对于一个有15万行随机排序的文件,它需要3秒多一点:

代码语言:javascript
运行
复制
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.08
Maximum resident set size (kbytes): 219152
票数 21
EN

Server Fault用户

发布于 2015-02-04 22:26:41

cat domain.txt _ rev _

票数 10
EN

Server Fault用户

发布于 2012-02-28 15:36:22

Perl稍微不那么神秘,或者至少更漂亮:

代码语言:javascript
运行
复制
use warnings;
use strict;

my @lines = <>;
chomp @lines;

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

print "$_\n" for @lines;

这是一个简单的古特曼-罗斯勒变换示例:我们将这些行转换为适当的可排序形式(此处,将域名拆分为句点并反转部分的顺序),使用本地词典排序对它们进行排序,然后将这些行转换回原来的形式。

票数 7
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/364330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档