我想对域名列表(Web 过滤器白名单)进行排序,从 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
。我有几个大型列表需要清理,因为有人在没有先查看的情况下添加了条目。
答案1
这个简单的 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()
which 返回一个迭代器,因此也需要将其包装进去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
答案2
这是一个可以完成您想要的操作的 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 秒。
答案3
cat 域.txt | rev | 排序 | rev
答案4
在 Unix 脚本中:反转、排序和反转:
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}'