tld에서 시작하여 왼쪽으로 작업하는 도메인 이름 (FQDN) 목록 정렬


20

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. 누군가 먼저 보지 않고 항목을 추가했기 때문에 정리가 필요한 여러 개의 큰 목록이 있습니다.


정렬 된 목록에 com도메인이 표시 되어서는 안 edu됩니까?
Sven

9
예, 수동 정렬에 실패하여 도구를 찾고 있습니다. :)
Zoredache


3
또한 파이썬 버전은 펄 버전에 비해 훌륭합니다. 파이썬의 정렬은 목록의 목록에서 작동하기 때문입니다. 펄의 정렬은 구현되지 않았으며 구현되어야했습니다.
Mark Wagner

1
참고로 OP가 Mozilla의 공개 접미사 ( publicsuffix.org ) 목록 에 따라 최상위 도메인 을 하나의 블록으로 처리 하도록 요청한 경우 훨씬 더 어려울 것 입니다. 언젠가는 그것을 할 수있을 것입니다 (프로젝트에는 좋을 것입니다), 다른 사람이 있습니까?
phk

답변:


15

이 간단한 파이썬 스크립트는 당신이 원하는 것을 할 것입니다. 이 예제에서는 파일 이름을 지정합니다 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

나는 많은 해결책을 보는 것을 좋아했다. 나는 파이썬 기반의 대답을 주로 받아들이고 있습니다. 왜냐하면 대부분의 다른 스크립트에 사용하기 때문입니다. 다른 답변도 모두 작동하는 것 같습니다.
Zoredache

1
TLD를 무시하고 도메인 이름을 기준으로 정렬하는 데 관심이있는 사람은 다음을 사용하십시오.data.sort(key=lambda x: x[1:])
Calimo

9

다음은 원하는 작업을 수행하는 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 초가 걸렸습니다.


이 스크립트를 bash 또는 다른 언어로 변환하는 것은 매우 간단합니다.
Mark Henderson

1,500 줄만 5 초가 걸린 것 같습니다. 내 파이썬 구현 은 1 초에 1,500, 3 초에 150,000을 수행합니다. PowerShell에서 무엇을 느리게 만드는가?
aculich 2012

그래, 오랜만이야 그래도 왜 그렇게 오래 걸리는지 모르겠습니다. 아마도 powershell은 실제로 이와 같은 일을 목표로하지 않기 때문입니다.
Mark Henderson

7

고양이 domain.txt | 레브 | 정렬 | 신부님


나는 그것이 효과가 있다고 생각한다. 나는 TLD를 정렬하는 것을 좋아하지만 이것이 달성하지 못할 것입니다. 이것을 사용하여, 나의 예에서 TLD는 순서가 될 것이다 (uk, mil, pl, com, edu, gov) 도메인 경계 대신에 간단한 왼쪽에서 오른쪽 정렬이기 때문이다.
Zoredache

내가 본 최고의 답변!
다니엘

1
rev domain.txt|sort|rev
Rich

6

약간 덜 비밀 스럽거나 더 예쁘다, 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 변환 의 간단한 예입니다 . 우리는 라인을 적절한 정렬 가능한 형식으로 변환하고 (여기에서 도메인 이름을 마침표로 분할하고 부품 순서를 반대로) 네이티브 사전 사전 정렬을 사용하여 정렬 한 다음 원래 형태로 돌아갑니다.


6

유닉스 스크립팅 : 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}'

단일 루프와 비슷한 것 : awk -F. '{for(i=NF;i>0;i--){printf ".%s",$i};printf "\t%s\n",$0}' file|sort|cut -f2로컬 호스트를 먼저 제거하고 싶을 수도 있습니다grep \. file | awk ...
Rich

3

여기에 (짧고 비밀스러운) 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" }

이 종류에 대한 타이밍 정보가 있습니까? 이것이 파이썬 구현 뿐만 아니라 @ Mark-Henderson의 PowerShell 구현 과 어떻게 비교되는지 궁금합니다 . 내가 사용 경과 된 시간 및 최대 메모리 통계를 위해. /usr/bin/time -v
aculich 2012

4
펄은 난독 화에 완전히 WINS.
Massimo

4
Perl 스크립트를 "짧고 암호화 된"것으로 설명하는 것은 불필요합니다.
Belmin Fernandez

@aculich, powershell 스크립트를 제외하고 모든 옵션이 파일에서 0.1 초 미만인 것 같습니다.
Zoredache

0
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)은 시도하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.