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
. 누군가 먼저 보지 않고 항목을 추가했기 때문에 정리가 필요한 여러 개의 큰 목록이 있습니다.
답변
이 간단한 파이썬 스크립트는 당신이 원하는 것을 할 것입니다. 이 예제에서는 파일 이름을 지정합니다 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)))
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
답변
다음은 원하는 작업을 수행하는 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 초가 걸렸습니다.
답변
고양이 domain.txt | 레브 | 정렬 | 신부님
답변
약간 덜 비밀 스럽거나 더 예쁘다, Perl :
use warnings;
use strict;
my @lines = <>;
chomp @lines;
@lines =
map { join ".", reverse split /\./ }
sort
map { join ".", reverse split /\./ }
@lines;
print "$_\n" for @lines;
이것은 Guttman–Rosler 변환 의 간단한 예입니다 . 우리는 라인을 적절한 정렬 가능한 형식으로 변환하고 (여기에서 도메인 이름을 마침표로 분할하고 부품 순서를 반대로) 네이티브 사전 사전 정렬을 사용하여 정렬 한 다음 원래 형태로 돌아갑니다.
답변
유닉스 스크립팅 : reverse, sort and reverse :
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}'
답변
여기에 (짧고 비밀스러운) perl이 있습니다 :
#!/usr/bin/perl -w
@d = <>; chomp @d;
for (@d) { $rd{$_} = [ reverse split /\./ ] }
for $d (sort { for $i (0..$#{$rd{$a}}) {
$i > $#{$rd{$b}} and return 1;
$rd{$a}[$i] cmp $rd{$b}[$i] or next;
return $rd{$a}[$i] cmp $rd{$b}[$i];
} } @d) { print "$d\n" }
답변
awk -F"." 's="";{for(i=NF;i>0;i--) {if (i<NF) s=s "." $i; else s=$i}; print s}' <<<filename>>> | sort | awk -F"." 's="";{for(i=NF;i>0;i--) {if (i<NF) s=s "." $i; else s=$i}; print s}'
이 작업은 도메인 이름으로 정리 된 각 파일을 되돌리고 다시 정렬하는 것입니다.
이것은 도메인 이름의 각 부분에 따라 오른쪽에서 왼쪽으로 사전 순으로 도메인 목록을 정렬합니다.
역 솔루션 ( rev <<<filename>>> | sort | rev
)은 시도하지 않았습니다.