我正在寻找排序的域名列表(一个网页过滤器白名单)从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
以防你想知道为什么,Squid卫兵,有一个错误/设计缺陷。如果www.example.com
和example.com
都包含在列表中,则忽略example.com
条目,您只能从www.example.com
访问内容。我有几个大的列表,需要一些清理,因为有人添加了条目,而不是先看。
发布于 2012-02-28 08:01:42
这个简单的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))))
对于一个有1500行随机排序的文件,大约需要0.02秒:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 21632
对于一个有15万行随机排序的文件,它需要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))
对于一个有1500行随机排序的文件,大约需要0.02秒:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 22096
对于一个有15万行随机排序的文件,它需要3秒多一点:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.08
Maximum resident set size (kbytes): 219152
发布于 2015-02-04 22:26:41
cat domain.txt _ rev _
发布于 2012-02-28 15:36:22
Perl稍微不那么神秘,或者至少更漂亮:
use warnings;
use strict;
my @lines = <>;
chomp @lines;
@lines =
map { join ".", reverse split /\./ }
sort
map { join ".", reverse split /\./ }
@lines;
print "$_\n" for @lines;
这是一个简单的古特曼-罗斯勒变换示例:我们将这些行转换为适当的可排序形式(此处,将域名拆分为句点并反转部分的顺序),使用本地词典排序对它们进行排序,然后将这些行转换回原来的形式。
https://serverfault.com/questions/364330
复制相似问题