Zor*_*che 24 scripting fqdn sort
我希望对从 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
Run Code Online (Sandbox Code Playgroud)
这就是我想要的输出。
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
Run Code Online (Sandbox Code Playgroud)
以防万一你想知道为什么,Squidguard,有一个错误/设计缺陷。如果www.example.com和example.com都包含在列表中,则该example.com条目将被忽略并且您只能访问来自 的内容www.example.com。我有几个需要清理的大列表,因为有人没有先查看就添加了条目。
acu*_*ich 17
这个简单的 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])
Run Code Online (Sandbox Code Playgroud)
要运行它,请使用:
cat file.txt | ./domain-sort.py
Run Code Online (Sandbox Code Playgroud)
请注意,这看起来有点丑陋,因为我写这更多或更少的一个简单的一行,我不得不使用的切片表示法[::-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)))
Run Code Online (Sandbox Code Playgroud)
在一个包含 1,500 行随机排序的文件中,它需要大约 0.02 秒:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 21632
Run Code Online (Sandbox Code Playgroud)
在一个包含 150,000 行随机排序的文件中,它需要 3 秒多一点的时间:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.20
Maximum resident set size (kbytes): 180128
Run Code Online (Sandbox Code Playgroud)
这是一个可以说更易读的版本,它执行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)
Run Code Online (Sandbox Code Playgroud)
在一个包含 1,500 行随机排序的文件中,它需要大约 0.02 秒:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 22096
Run Code Online (Sandbox Code Playgroud)
在一个包含 150,000 行随机排序的文件中,它需要 3 秒多一点的时间:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.08
Maximum resident set size (kbytes): 219152
Run Code Online (Sandbox Code Playgroud)
Mar*_*son 10
这是一个 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
Run Code Online (Sandbox Code Playgroud)
在 1,500 条记录上运行它 - 在相当强大的桌面上花费了 5 秒钟。
稍微不那么神秘,或者至少更漂亮,Perl:
use warnings;
use strict;
my @lines = <>;
chomp @lines;
@lines =
map { join ".", reverse split /\./ }
sort
map { join ".", reverse split /\./ }
@lines;
print "$_\n" for @lines;
Run Code Online (Sandbox Code Playgroud)
这是Guttman-Rosler 变换的一个简单示例:我们将行转换为适当的可排序形式(这里,将域名按句点拆分并颠倒部分的顺序),使用本机字典排序对它们进行排序,然后转换为线条恢复到原来的形式。
在 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}'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8634 次 |
| 最近记录: |