从 tld 开始向左对域名 (FQDN) 列表进行排序

从 tld 开始向左对域名 (FQDN) 列表进行排序

我想对域名列表(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}'

相关内容